home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
m2
/
cat3src
/
magic
/
i
/
mtdials.i
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
Macintosh to JP
MacRoman (detected)
NeXTSTEP
RISC OS/Acorn
Shift JIS
UTF-8
Wrap
Modula Implementation
|
1997-10-26
|
120.8 KB
|
3,648 lines
(*----------------------------------------------------------------------*
* *
* MAGICTOOLS Modula's All purpose GEM Interface Cadre Toolbox *
* ÿ ÿ ÿ ÿ ÿ *
*----------------------------------------------------------------------*
* Version 3.30 02.02.1992 (C)90/91/92 by Peter Hellinger Software *
*----------------------------------------------------------------------*
* Dieses Modul ist urheberrechtlich geschtzt. *
* *
* Die Verffentlichung des Quelltextes oder Teilen daraus, sowie die *
* Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
* oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail- *
* boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen *
* Einverstndnisserklrung des Autors. *
* *
* Die Verbreitung des Moduls als Teil eines gelinkten Programms ist *
* fr Lizenznehmer ausdrcklich erlaubt! Der Autor behlt sich das *
* Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
* widerrufen. *
*----------------------------------------------------------------------*)
IMPLEMENTATION MODULE mtDials;
(*----------------------------------------------------------------------*
* Int. Vers | Datum | Name | nderung *
*-----------+----------+------+----------------------------------------*
* 3.00 | 18.01.92 | Hp | *
* 3.01 | 22.01.92 | Hp | Userobjects in das Modul mtXobjects *
* | | | ausgelagert. Damit Weg frei, um in MM2 *
* | | | richtige Progdef zu realisieren. *
* 3.02 | 03.02.92 | Hp | PROGDEF-Simulator fr Non-MM2-Compiler *
* | | | eingebaut. *
* 3.03 | 10.02.92 | | DeskX und DeskY werden ausgewertet, *
* | | | Dadurch einige Aufrufe von Windget *
* | | | eingespart... *
* 3.04 | 26.02.92 | Hp | Messagepipe bei Userhandler zulassen *
* 3.05 | 18.03.92 | Hp | Bugfix beim Objekthandling *
*-----------+----------+------+----------------------------------------*)
(* IMPLEMENTATION FR >>> Megamax-Modula-2 <<< *)
(* *)
(*$R- Range-Checks *)
(*$S- Stack-Check *)
(* *)
(*----------------------------------------------*)
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
FROM MagicSys IMPORT Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
CastToChar, CastToByte, CastToByteset, CastToInt,
CastToCard, CastToBitset, CastToWord, CastToLInt,
CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
TosVersion, Accessory, Basepage, SysHeader, TosDate;
FROM SYSTEM IMPORT ADDRESS, CADR, ADR, TSIZE, CODE, CALLSYS;
FROM MagicBIOS IMPORT KRSHIFT, KLSHIFT, KCTRL, KALT, KCAPS;
FROM MagicVDI IMPORT VDIIntIn, VDIIntOut, VDIPtsIn, VDIPtsOut, VDIControl,
VDICall, tWorkIn, tWorkOut, MFDB, ShowCursor,
HideCursor, SetFillcolor, SetWritemode, Fat, Light,
Italic, Underline, Outline, Shadowed, SetTexteffect,
SetTextalignment, XOR, REPLACE, TRANSPARENT, Text,
SetClipping, SetFillperimeter, InqFaceinfo,
SetCharheight, SetTextcolor, Ellipse, EllipticalArc,
SetLinecolor;
FROM MagicAES IMPORT GBOX, GTEXT, GBOXTEXT, GIMAGE, GPROGDEF, GIBOX,
GBUTTON, GBOXCHAR, GSTRING, GFTEXT, GFBOXTEXT,
GICON, GTITLE, SELECTABLE, DEFAULT, Exit, EDITABLE,
RBUTTON, LASTOB, TOUCHEXIT, HIDETREE, INDIRECT,
SELECTED, CROSSED, CHECKED, DISABLED, OUTLINED,
SHADOWED, DRAW3D, WHITEBAK, OBJECT, ObjcAdd, RTREE,
RsrcGaddr, EDINIT, EDCHAR, EDEND, (*ObjcEdit,*) ObjcDraw,
ObjcFind, BEGMCTRL, ENDMCTRL, WindUpdate, WFFULLXYWH,
WindGet, FMDSTART, FMDGROW, FMDSHRINK, FMDFINISH,
FormDial, FormCenter, FormKeybd, GrafMkstate, ARROW,
FLATHAND, PtrPARMBLK, Objcspec, GrafMouse, GrafDragbox,
GrafHandle, MUKEYBD, MUBUTTON, MUM1, MUM2, MUMESAG,
MUTIMER, AESIntIn, AESIntOut, AESCall, ObjcOffset,
GrafWatchbox;
FROM mtUtils IMPORT tRect, tObjcTree, AnyType, InclFlag, ExclFlag,
InFlag, InclState, ExclState, InState, ObjcString,
ObjcStringAdr, SetObjcString, SetObjcStringAdr,
ObjcStrLen, ObjcPos, ObjcParent, ObjcArea, SetObjcRect,
ObjcFrame, CalcArea, ScanFlags, DoubleClick, Bounce,
Min, Max, SearchType, SearchFlags, SearchState,
AbsRect, SetState, SetFlag;
FROM mtAppl IMPORT OpenWorkstation, Bitplanes, MouseOn, MouseOff,
MouseBusy, MouseHand, MouseArrow, CharWidth,
CharHeight, BoxWidth, BoxHeight, InstallTermproc,
PrivateWS, MaxColors, StoreMouse, RestoreMouse,
DeskX, DeskY, MaxWidth, MaxHeight, AESFontsize;
FROM mtArea IMPORT AREA, NewAREA, DisposeAREA, FreeArea, SaveArea,
CopyArea, RestoreArea, MoveArea;
FROM MagicCookie IMPORT VirtualScreen, FindCookie;
FROM MagicStrings IMPORT Assign, Append, Length, Cap, Equal, Pos;
FROM MagicBitOps IMPORT Operation, BitOp;
FROM mtPopups IMPORT TreePopup;
FROM mtRsc IMPORT RESOURCE, GaddrRsc, RelocRsc;
IMPORT MagicAES;
IMPORT MagicVDI;
IMPORT MagicBIOS;
IMPORT MagicDOS;
IMPORT MagicXBIOS;
IMPORT mtXobjects;
(*----------------------------------------------------------------------*
* Resource-Coder 1.03 (C)92 by Peter Hellinger Software *
*----------------------------------------------------------------------*
* Inline-Resource erzeugt am 16.10.1993 17:57:44 *
*----------------------------------------------------------------------*)
TYPE tRscData = ARRAY [0..902] OF CARDINAL;
CONST RscData = tRscData {
00000H, 00030H, 00318H, 00318H, 00318H, 003DCH, 003DCH, 005B8H, 005B8H,
00024H, 0001FH, 00003H, 00000H, 00000H, 0000EH, 00000H, 00000H, 00708H,
00000H, 00030H, 00000H, 000F0H, 00000H, 001B0H, 0FFFFH, 00001H, 00007H,
00014H, 00000H, 00010H, 00002H, 01100H, 00000H, 00000H, 00043H, 00008H,
00002H, 0FFFFH, 0FFFFH, 01119H, 00000H, 00010H, 00001H, 01100H, 00041H,
00000H, 00002H, 00001H, 00003H, 0FFFFH, 0FFFFH, 0131CH, 00000H, 00020H,
00000H, 003DCH, 00002H, 00A00H, 0000EH, 00001H, 00004H, 0FFFFH, 0FFFFH,
0001CH, 00000H, 00000H, 00000H, 003EBH, 00002H, 00002H, 0003FH, 00001H,
00005H, 0FFFFH, 0FFFFH, 0001CH, 00000H, 00000H, 00000H, 0042BH, 00002H,
00003H, 0003FH, 00001H, 00006H, 0FFFFH, 0FFFFH, 0001CH, 00000H, 00000H,
00000H, 0046BH, 00002H, 00004H, 0003FH, 00001H, 00007H, 0FFFFH, 0FFFFH,
0001CH, 00000H, 00000H, 00000H, 004ABH, 00002H, 00005H, 0003FH, 00001H,
00000H, 0FFFFH, 0FFFFH, 0001CH, 00020H, 00000H, 00000H, 004EBH, 00002H,
00006H, 0003FH, 00001H, 0FFFFH, 00001H, 00007H, 00014H, 00000H, 00020H,
000FFH, 01100H, 00000H, 00000H, 00016H, 00008H, 00002H, 0FFFFH, 0FFFFH,
0001CH, 00001H, 00000H, 00000H, 0052BH, 00000H, 00000H, 00016H, 00001H,
00003H, 0FFFFH, 0FFFFH, 0001CH, 00001H, 00000H, 00000H, 0053EH, 00000H,
00001H, 00016H, 00001H, 00004H, 0FFFFH, 0FFFFH, 0001CH, 00001H, 00000H,
00000H, 00552H, 00000H, 00002H, 00016H, 00001H, 00005H, 0FFFFH, 0FFFFH,
0001CH, 00001H, 00000H, 00000H, 00567H, 00000H, 00003H, 00016H, 00001H,
00006H, 0FFFFH, 0FFFFH, 0001CH, 00001H, 00000H, 00000H, 0057AH, 00000H,
00005H, 00016H, 00001H, 00007H, 0FFFFH, 0FFFFH, 0001CH, 00001H, 00000H,
00000H, 0058CH, 00000H, 00006H, 00016H, 00001H, 00000H, 0FFFFH, 0FFFFH,
0001CH, 00021H, 00000H, 00000H, 005A3H, 00000H, 00007H, 00016H, 00001H,
0FFFFH, 00001H, 0000EH, 00014H, 00000H, 00000H, 000FFH, 01100H, 00000H,
00000H, 0001AH, 00005H, 00002H, 0FFFFH, 0FFFFH, 00017H, 00000H, 00000H,
00000H, 00318H, 00002H, 00001H, 00002H, 00001H, 00003H, 0FFFFH, 0FFFFH,
00017H, 00000H, 00000H, 00000H, 00326H, 00005H, 00001H, 00002H, 00001H,
00004H, 0FFFFH, 0FFFFH, 00017H, 00000H, 00000H, 00000H, 00334H, 00009H,
00001H, 00002H, 00001H, 00005H, 0FFFFH, 0FFFFH, 00017H, 00000H, 00000H,
00000H, 00342H, 0000CH, 00001H, 00002H, 00001H, 00006H, 0FFFFH, 0FFFFH,
00017H, 00000H, 00000H, 00000H, 00350H, 00010H, 00001H, 00002H, 00001H,
00007H, 0FFFFH, 0FFFFH, 00017H, 00000H, 00000H, 00000H, 0035EH, 00013H,
00001H, 00002H, 00001H, 00008H, 0FFFFH, 0FFFFH, 00017H, 00000H, 00000H,
00000H, 0036CH, 00016H, 00001H, 00002H, 00001H, 00009H, 0FFFFH, 0FFFFH,
00017H, 00000H, 00000H, 00000H, 0037AH, 00002H, 00003H, 00002H, 00800H,
0000AH, 0FFFFH, 0FFFFH, 00017H, 00000H, 00000H, 00000H, 00388H, 00005H,
00003H, 00002H, 00800H, 0000BH, 0FFFFH, 0FFFFH, 00017H, 00000H, 00000H,
00000H, 00396H, 00009H, 00003H, 00002H, 00800H, 0000CH, 0FFFFH, 0FFFFH,
00017H, 00000H, 00000H, 00000H, 003A4H, 0000CH, 00003H, 00002H, 00800H,
0000DH, 0FFFFH, 0FFFFH, 00017H, 00000H, 00000H, 00000H, 003B2H, 00010H,
00003H, 00002H, 00800H, 0000EH, 0FFFFH, 0FFFFH, 00017H, 00000H, 00000H,
00000H, 003C0H, 00013H, 00003H, 00002H, 00800H, 00000H, 0FFFFH, 0FFFFH,
00017H, 00020H, 00000H, 00000H, 003CEH, 00016H, 00003H, 00002H, 00800H,
00000H, 005B8H, 00002H, 00010H, 00000H, 00000H, 00001H, 00000H, 005D8H,
00002H, 00010H, 00000H, 00000H, 00001H, 00000H, 005F8H, 00002H, 00010H,
00000H, 00000H, 00001H, 00000H, 00618H, 00002H, 00010H, 00000H, 00000H,
00001H, 00000H, 00638H, 00002H, 00010H, 00000H, 00000H, 00001H, 00000H,
00658H, 00002H, 00010H, 00000H, 00000H, 00001H, 00000H, 00678H, 00002H,
00010H, 00000H, 00000H, 00001H, 00000H, 00698H, 00002H, 00008H, 00000H,
00000H, 00001H, 00000H, 006A8H, 00002H, 00008H, 00000H, 00000H, 00001H,
00000H, 006B8H, 00002H, 00008H, 00000H, 00000H, 00001H, 00000H, 006C8H,
00002H, 00008H, 00000H, 00000H, 00001H, 00000H, 006D8H, 00002H, 00008H,
00000H, 00000H, 00001H, 00000H, 006E8H, 00002H, 00008H, 00000H, 00000H,
00001H, 00000H, 006F8H, 00002H, 00008H, 00000H, 00000H, 00001H, 05A65H,
06963H, 06865H, 06E61H, 07573H, 07761H, 0686CH, 0007FH, 02001H, 02002H,
02003H, 02004H, 02005H, 02006H, 02007H, 02008H, 02009H, 0200AH, 0200BH,
0200CH, 0200DH, 0200EH, 0200FH, 02010H, 02011H, 02012H, 02013H, 02014H,
02015H, 02016H, 02017H, 02018H, 02019H, 0201AH, 0201BH, 0201CH, 0201DH,
0201EH, 0201FH, 00080H, 02081H, 02082H, 02083H, 02084H, 02085H, 02086H,
02087H, 02088H, 02089H, 0208AH, 0208BH, 0208CH, 0208DH, 0208EH, 0208FH,
02090H, 02091H, 02092H, 02093H, 02094H, 02095H, 02096H, 02097H, 02098H,
02099H, 0209AH, 0209BH, 0209CH, 0209DH, 0209EH, 0209FH, 000A0H, 020A1H,
020A2H, 020A3H, 020A4H, 020A5H, 020A6H, 020A7H, 020A8H, 020A9H, 020AAH,
020ABH, 020ACH, 020ADH, 020AEH, 020AFH, 020B0H, 020B0H, 020B2H, 020B3H,
020B4H, 020B5H, 020B6H, 020B7H, 020B8H, 020B9H, 020BAH, 020BBH, 020BCH,
020BDH, 020BEH, 020BFH, 000C0H, 020C1H, 020C2H, 020C3H, 020C4H, 020C5H,
020C6H, 020C7H, 020C8H, 020C9H, 020CAH, 020CBH, 020CCH, 020CDH, 020CEH,
020CFH, 020D0H, 020D1H, 020D2H, 020D3H, 020D4H, 020D5H, 020D6H, 020D7H,
020D8H, 020D9H, 020DAH, 020DBH, 020DCH, 020DDH, 020DEH, 020DFH, 000E0H,
020E1H, 020E2H, 020E3H, 020E4H, 020E5H, 020E6H, 020E7H, 020E8H, 020E9H,
020EAH, 020EBH, 020ECH, 020EDH, 020EEH, 020EFH, 020F0H, 020F1H, 020F2H,
020F3H, 020F4H, 020F5H, 020F6H, 020F7H, 020F8H, 020F9H, 020FAH, 020FBH,
020FCH, 020FDH, 020FEH, 020FFH, 00020H, 02041H, 07573H, 06C94H, 07365H,
06E20H, 06D69H, 07420H, 0414CH, 05400H, 02020H, 04175H, 0736CH, 09473H,
0656EH, 0206DH, 06974H, 02043H, 05452H, 04C00H, 02020H, 0536FH, 06C69H,
06465H, 02076H, 06572H, 07363H, 06869H, 06562H, 0656EH, 00020H, 02045H,
07277H, 06569H, 07465H, 07274H, 06573H, 02045H, 06469H, 07400H, 02020H,
0616EH, 0204DH, 06175H, 07370H, 06F73H, 06974H, 0696FH, 06E00H, 02020H,
0616EH, 0206CH, 06574H, 07A74H, 06572H, 02050H, 06F73H, 06974H, 0696FH,
06E20H, 00020H, 02047H, 0726FH, 0772DH, 02F53H, 06872H, 0696EH, 06B62H,
06F78H, 0656EH, 00000H, 00000H, 07FFEH, 04002H, 04002H, 04002H, 04002H,
04002H, 04002H, 04002H, 04002H, 04002H, 04002H, 04002H, 04002H, 07FFEH,
00000H, 00000H, 07FFEH, 06006H, 0500AH, 04812H, 04422H, 04242H, 04182H,
04182H, 04242H, 04422H, 04812H, 0500AH, 06006H, 07FFEH, 00000H, 00000H,
003C0H, 00C30H, 01008H, 02004H, 02004H, 04002H, 04002H, 04002H, 04002H,
02004H, 02004H, 01008H, 00C30H, 003C0H, 00000H, 00000H, 003C0H, 00C30H,
01008H, 023C4H, 027E4H, 04FF2H, 04FF2H, 04FF2H, 04FF2H, 027E4H, 023C4H,
01008H, 00C30H, 003C0H, 00000H, 00000H, 00000H, 023C0H, 03C30H, 03808H,
03C08H, 00004H, 02004H, 02004H, 02000H, 0103CH, 0101CH, 00C3CH, 003C4H,
00000H, 00000H, 0FFFFH, 0FFFFH, 0DC3FH, 0C3CFH, 0C7F7H, 0C3F7H, 0FFFBH,
0DFFBH, 0DFFBH, 0DFFFH, 0EFC3H, 0EFE3H, 0F3C3H, 0FC3BH, 0FFFFH, 0FFFFH,
00000H, 07FFEH, 05112H, 04002H, 04446H, 04002H, 05112H, 04002H, 04446H,
04002H, 05112H, 06002H, 04446H, 04002H, 07FFEH, 00000H, 07FFEH, 04002H,
04002H, 04002H, 04002H, 04002H, 07FFEH, 00000H, 07FFEH, 0700EH, 04C32H,
043C2H, 04C32H, 0700EH, 07FFEH, 00000H, 01FF8H, 02004H, 04002H, 04002H,
04002H, 02004H, 01FF8H, 00000H, 01FF8H, 02004H, 04FF2H, 05FFAH, 04FF2H,
02004H, 01FF8H, 00000H, 027E0H, 03818H, 03804H, 03C00H, 0003CH, 0201CH,
0181CH, 007E4H, 0D01FH, 0C7E7H, 0C7FBH, 0C3FFH, 0FFC3H, 0DFE3H, 0E7E3H,
0F81BH, 07FFEH, 04002H, 0488AH, 04002H, 06222H, 04002H, 07FFEH, 00000H,
00000H, 00000H, 00000H
}; (* Ende RscData *)
(*----------------------------------------------------------------------*)
CONST ShortCut = '['; (* Zeichen das dem Shortcut vorausgeht *)
toScreen = TRUE;
toRAM = FALSE;
MaxKeys = 255;
CONST (*
UndoButton = 14; (* Flag 14 kennzeichnet einen Undobutton *)
HelpButton = 15; (* Flag 15 kennzeichnet einen Helpbutton *)
*)
cCoords = 13; (* Flag 13 kennzeichnet Objekte mit gefixten Koordinaten *)
(*
LongEdit = 24; (* Erweiterter Objekttyp fr lange Editfelder *)
*)
CONST MLinks = Bit0;
MRechts = Bit1;
CONST cMove = Bit0; (* Dialog ist verschiebbar *)
cRestore = Bit1; (* DDISABLE wurde aufgerufen *)
cUser = Bit2; (* Userhandler ist installiert *)
TYPE Userkey = RECORD
object: sINTEGER;
scan: sINTEGER;
kbstate: sBITSET;
action: BOOLEAN;
END;
TYPE Keylist = ARRAY [0..MaxKeys] OF Userkey;
(* Liste der Shortcuts und Userkeys, die der Dialog
* kennt und verwaltet
*)
TYPE DIALOG = POINTER TO Dialog;
Dialog = RECORD
tree: tObjcTree; (* Objektbaum des Dialogs *)
back: AREA; (* Hintergrund *)
front: AREA; (* Vordergrund *)
keys: Keylist; (* Liste der Tastencodes *)
flags: sBITSET; (* Zustandsflags *)
proc: UserHandler; (* UserHandler *)
pmode: sINTEGER; (* Modus des Handlers *)
ptime: sINTEGER; (* Timerwert *)
prmod: sINTEGER; (* Rechteckmodus *)
prect: tRect; (* Rechteck *)
pmess: ADDRESS; (* Adresse des Messagepuffers *)
next: DIALOG; (* Nchster Dialog in der Kette *)
END;
VAR Tastatur: MagicXBIOS.PtrKEYTAB; (* Zeiger auf Tastaturtabelle *)
VAR scancodes: ARRAY [48..90] OF sINTEGER;
(* Tabelle der Scancodes anhand des ASCII-Zeichens *)
VAR Config: sBITSET; (* Globales Config-Flagset *)
ROffset: sINTEGER; (* Offset fr Radio- und Checkbutton *)
ChSize: sINTEGER; (* Default-Fontgre in PIXEL *)
ChWidth: sINTEGER; (* Default-Zeichenbreite in PIXEL *)
kbshift: sBITSET; (* Globaler Tastaturstatus *)
ScreenMFDB: MFDB; (* MFDB fr Bildschirm *)
area: AREA; (* AREA fr dies und das *)
screen: tRect; (* Ausmae des gesamten Schirms *)
bound: tRect; (* Flche des Desktops *)
small: tRect; (* Default-Rechteck mit Gre Null *)
clip: tRect; (* Clipping-Rechteck *)
dummy: tRect; (* Zur allgemeinen Verwendung *)
ShortKey: sBITSET; (* Aktuelle Auslsetaste (ALT/CTRL) *)
Dials: DIALOG; (* Liste der Dialoge *)
asciitab: tObjcTree; (* Dialog fr Nicht-Tastatur Zeichen *)
confdial: tObjcTree; (* Konfigurations-Popupmen *)
init: sCARDINAL; (* Init-Variable *)
mode3D: BOOLEAN; (* 3D-Modus An/Aus *)
rscData: POINTER TO tRscData; (* Buffer fr interne Resource *)
VAR mKnopf: ARRAY [FALSE..TRUE] OF ADDRESS; (* Runder Knopf *)
mSelect: ARRAY [FALSE..TRUE] OF ADDRESS; (* Ankreuzbox *)
mCircle: ARRAY [FALSE..TRUE] OF ADDRESS; (* Circlebutton *)
(* Wie oben jedoch fr Auflsungen *)
fKnopf: ARRAY [FALSE..TRUE] OF ADDRESS;
fSelect: ARRAY [FALSE..TRUE] OF ADDRESS;
fCircle: ARRAY [FALSE..TRUE] OF ADDRESS;
mPunktEin: ADDRESS;
fPunktEin: ADDRESS;
(* Allgemeine Variable *)
VAR msgBuff: ARRAY [0..7] OF sINTEGER;
mrect: tRect;
mX, mY: sINTEGER;
button: sBITSET;
taste: sINTEGER;
scan: sINTEGER;
clicks: sINTEGER;
ascii, ch: CHAR;
event: sBITSET;
control7: POINTER TO ADDRESS; (* it's tricky... *)
control9: POINTER TO ADDRESS;
at: AnyType;
(* Fr lange Editfelder *)
theText: ARRAY [0..1023] OF CHAR;
IsMagiCScroll: BOOLEAN; (* MagiC handelt lange Editfelder *)
lastPos: sINTEGER;
VAR dialDo: DialDoProc; (* Functionpointer to DialDo *)
(*----------------------------------------------------------------------*)
VAR conterm[0484H]: ByteSet;
PROCEDURE Glocke;
CONST glocke = 2;
VAR stack: ADDRESS;
BEGIN
stack:= 0; MagicDOS.Super (stack);
IF (glocke IN conterm) THEN MagicBIOS.Bconout (MagicBIOS.CON, CHR(7)); END;
MagicDOS.Super (stack);
END Glocke;
PROCEDURE GetKeytable (): MagicXBIOS.PtrKEYTAB;
VAR tb: ADDRESS;
BEGIN
tb:= Nil; RETURN MagicXBIOS.Keytbl (tb, tb, tb);
END GetKeytable;
PROCEDURE DialConfig (flag: sINTEGER; set: BOOLEAN);
BEGIN
IF set THEN INCL (Config, flag); ELSE EXCL (Config, flag); END;
IF (UseALT IN Config) THEN ShortKey:= {KALT} ELSE ShortKey:= {KCTRL} END;
END DialConfig;
PROCEDURE GetDialConfig (): sBITSET;
BEGIN
RETURN Config;
END GetDialConfig;
PROCEDURE GetKbdState (): sBITSET;
BEGIN
RETURN kbshift;
END GetKbdState;
PROCEDURE GetDIALOG (tree: ADDRESS): DIALOG;
VAR (*$Reg*) p: DIALOG;
BEGIN
p:= Dials;
WHILE p # NIL DO
IF p^.tree = tree THEN RETURN p; END;
p:= p^.next;
END;
RETURN NIL;
END GetDIALOG;
(*-----------------------------------------------------------------------*)
PROCEDURE SetUserkey (tree: ADDRESS; object, scan: sINTEGER;
kbstate: sBITSET; action, set: BOOLEAN);
VAR dial: DIALOG;
(*$Reg*) i: sINTEGER;
eol: BOOLEAN;
PROCEDURE FindUserKey (): sINTEGER;
VAR i: sINTEGER;
BEGIN
FOR i:= 0 TO MaxKeys DO
IF (dial^.keys[i].scan = -1) THEN RETURN -1; END;
IF (dial^.keys[i].object = object) AND
(dial^.keys[i].scan = scan) AND
(dial^.keys[i].kbstate = kbstate) THEN RETURN i; END;
END; (* FOR *)
END FindUserKey;
BEGIN
dial:= GetDIALOG (tree);
IF (dial = NIL) (* Kein gltiger Dialog *) OR
(scan = 0) (* Kein gltiger Scancode *) THEN RETURN; END;
i:= 0;
IF set THEN (* Tastatureintrag machen *)
(* Testen, ob nicht schon eingetragen *)
IF FindUserKey () >= 0 THEN RETURN; END;
(* Freien Eintrag suchen. Freie Eintrge sind mit Scancode 0 gekennzeichnet,
* das Ende der Liste wird durch Scancode -1 erkannt.
*)
WHILE dial^.keys[i].scan > 0 DO INC (i); END;
IF i < MaxKeys THEN (* Letzen Eintrag fr EndOfList freihalten *)
(* Bei Shift-Tasten nicht unterscheiden *)
IF (Bit0 IN kbstate) OR (Bit1 IN kbstate) THEN
kbstate:= kbstate + {Bit0, Bit1};
END;
eol:= dial^.keys[i].scan = -1;
dial^.keys[i].object:= object;
dial^.keys[i].scan:= scan;
dial^.keys[i].kbstate:= kbstate;
dial^.keys[i].action:= action;
IF eol THEN (* Neues EndOfList *) dial^.keys[i + 1].scan:= -1; END;
END;
ELSE (* Tastatureintrag lschen *)
i:= FindUserKey ();
IF i >= 0 THEN
dial^.keys[i].object:= -1;
dial^.keys[i].scan:= 0;
dial^.keys[i].kbstate:= {};
END;
END; (* IF *)
END SetUserkey;
PROCEDURE ResetUserkeys (tree: ADDRESS);
VAR (*$Reg*) q: DIALOG;
(*$Reg*) i: sINTEGER;
BEGIN
q:= GetDIALOG (tree);
FOR i:= 0 TO MaxKeys DO (* Tastaturliste lschen *)
q^.keys[i].object:= -1;
q^.keys[i].scan:= -1;
q^.keys[i].kbstate:= {};
END;
END ResetUserkeys;
(*-----------------------------------------------------------------------*)
PROCEDURE ObjcExtype (tree: ADDRESS; entry, extyp: sINTEGER);
VAR (*$Reg*) o: tObjcTree;
BEGIN
o:= tree;
IF o^[entry].obType # GPROGDEF THEN
at.lint:= o^[entry].obType;
at.b2:= CastToByte (extyp);
o^[entry].obType:= at.lint;
END;
END ObjcExtype;
PROCEDURE GetObjcExtype (tree: ADDRESS; entry: sINTEGER;
VAR extyp, typ: sINTEGER);
BEGIN
at.lint:= mtXobjects.GetObtype (tree, entry);
extyp:= CastToInt (at.b2);
typ:= CastToInt (at.b1);
END GetObjcExtype;
PROCEDURE GetLowbyte (value: sINTEGER): sINTEGER;
VAR t: AnyType;
BEGIN
t.lint:= value; RETURN CastToInt (t.b1);
END GetLowbyte;
(*----------------------------------------------------------------------*
* Zeichenroutinen unabhngig vom Objekt *
*----------------------------------------------------------------------*)
PROCEDURE Rect (x, y, w, h, color: sINTEGER);
(* Zeichnet eine Rechteckflche *)
VAR i: sINTEGER;
BEGIN
i:= SetFillcolor (PrivateWS, color);
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDIPtsIn[2]:= x + w;
VDIPtsIn[3]:= y + h;
VDICall(11, 2, 0, 1, PrivateWS);
IF color # 0 THEN i:= SetFillcolor (PrivateWS, 0); END;
END Rect;
PROCEDURE Line (x, y, w, h: sINTEGER);
BEGIN
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y;
VDIPtsIn[2]:= x + w;
VDIPtsIn[3]:= y + h;
VDICall(6, 2, 0, 0, PrivateWS);
END Line;
PROCEDURE Frame (x, y, w, h, times: sINTEGER);
(* Zeichnet einen Rahmen, times bestimmt die Dicke *)
VAR i: sINTEGER;
(*$Reg*) a: sINTEGER;
b: sINTEGER;
BEGIN
a:= 0; b:= 0;
FOR i:= 1 TO times DO
DEC (x); DEC (y); INC (w, 2); INC (h, 2);
VDIPtsIn[0 + a]:= x;
VDIPtsIn[1 + a]:= y;
VDIPtsIn[2 + a]:= x + w;
VDIPtsIn[3 + a]:= y;
VDIPtsIn[4 + a]:= VDIPtsIn[2 + a]; (* x + w - 1; *)
VDIPtsIn[5 + a]:= y + h;
VDIPtsIn[6 + a]:= x;
VDIPtsIn[7 + a]:= VDIPtsIn[5 + a]; (* y + h - 1; *)
VDIPtsIn[8 + a]:= x;
VDIPtsIn[9 + a]:= y;
INC (a, 10); INC (b, 5);
END;
VDICall(6, b, 0, 0, PrivateWS);
END Frame;
PROCEDURE Frame3D (x, y, w, h, times, hCol, dCol: sINTEGER);
(* Zeichnet einen Rahmen, times bestimmt die Dicke *)
VAR i: sINTEGER;
(*$Reg*) a: sINTEGER;
b: sINTEGER;
BEGIN
a:= 0; b:= 0;
FOR i:= 1 TO times DO
DEC (x); DEC (y); INC (w, 2); INC (h, 2);
(* Farbe oben und links setzen *)
a := SetLinecolor (PrivateWS, hCol);
(* links *)
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y + h; (* y + h - 1; *)
VDIPtsIn[2]:= x;
VDIPtsIn[3]:= y;
(* oben *)
VDIPtsIn[4]:= x + w;
VDIPtsIn[5]:= y;
VDICall(6, 3, 0, 0, PrivateWS);
(* Farbe rechts und unten setzen *)
a := SetLinecolor (PrivateWS, dCol);
(* rechts *)
VDIPtsIn[0]:= x + w; (* x + w - 1; *)
VDIPtsIn[1]:= y;
VDIPtsIn[2]:= x + w;
VDIPtsIn[3]:= y + h;
(* unten *)
VDIPtsIn[4]:= x;
VDIPtsIn[5]:= y + h;
VDICall(6, 3, 0, 0, PrivateWS);
END;
a := SetLinecolor (PrivateWS, 1);
END Frame3D;
PROCEDURE Circle (x, y, w, h: sINTEGER; fillColor: INTEGER; fill: BOOLEAN);
(* Zeichnet einen Kreis, color bestimmt die Farbe *)
VAR i: sINTEGER;
(*$Reg*) a: sINTEGER;
b: BOOLEAN;
BEGIN
b:= MagicVDI.SetFillperimeter (PrivateWS, TRUE); (* Mit Rand *)
i:= MagicVDI.SetFillcolor (PrivateWS, fillColor); (* Fllfarbe *)
IF ~fill
THEN
i:= MagicVDI.SetFillinterior (PrivateWS, 0); (* Nicht fllen *)
ELSE
i:= MagicVDI.SetFillinterior (PrivateWS, 1); (* Fllen *)
END;
Ellipse (PrivateWS, x+ (w DIV 2), y + (h DIV 2), w DIV 2, h DIV 2);
i:= MagicVDI.SetFillcolor (PrivateWS, 0); (* Fllfarbe wei *)
b:= MagicVDI.SetFillperimeter (PrivateWS, FALSE); (* Kein Rand *)
i:= MagicVDI.SetFillinterior (PrivateWS, 1); (* fllen *)
END Circle;
PROCEDURE Circle3D (x, y, w, h: sINTEGER; sel: BOOLEAN);
CONST upperRightRadius = 450;
lowerLeftRadius = 2200;
VAR midX, midY,
radX, radY : INTEGER;
(*$Reg*) a: sINTEGER;
b: BOOLEAN;
col1, col2,
col3, col4 : INTEGER;
BEGIN
(* Zeichnet einen kompletten 3D-Radiobutton *)
(* Mittelpunkt und Radien bestimmen *)
midX := x + (w DIV 2);
midY := y + (h DIV 2);
radX := w DIV 2; IF ODD (w) THEN INC (radX); END;
radY := h DIV 2; IF ODD (h) THEN INC (radY); END;
b:= MagicVDI.SetFillperimeter (PrivateWS, TRUE); (* Mit Rand *)
a:= MagicVDI.SetFillinterior (PrivateWS, 0); (* Nicht fllen *)
IF ~sel
THEN
col1 := 9; (* links oben auen *)
col2 := 0; (* links oben innen *)
col3 := 9; (* rechts unten innen *)
col4 := 1; (* rechts unten auen *)
ELSE
col1 := 1; (* links oben auen *)
col2 := 9; (* links oben innen *)
col3 := 0; (* rechts unten innen *)
col4 := 9; (* rechts unten auen *)
END;
(* Jetzt vier Bgen mit den Farben zeichnen *)
a := SetLinecolor (PrivateWS, col1);
EllipticalArc (PrivateWS, midX, midY, radX+1, radY+1, upperRightRadius, lowerLeftRadius);
a := SetLinecolor (PrivateWS, col2);
EllipticalArc (PrivateWS, midX, midY, radX, radY, upperRightRadius, lowerLeftRadius);
a := SetLinecolor (PrivateWS, col3);
EllipticalArc (PrivateWS, midX, midY, radX, radY, lowerLeftRadius, upperRightRadius);
a := SetLinecolor (PrivateWS, col4);
EllipticalArc (PrivateWS, midX, midY, radX+1, radY+1, lowerLeftRadius, upperRightRadius);
IF sel
THEN
a:= MagicVDI.SetFillinterior (PrivateWS, 1); (* Fllen *)
a:= MagicVDI.SetFillcolor (PrivateWS, 1); (* Fllfarbe *)
Ellipse (PrivateWS, midX, midY, 2, 2);
END;
a := MagicVDI.SetFillcolor (PrivateWS, 0); (* Fllfarbe wei *)
b := MagicVDI.SetFillperimeter (PrivateWS, FALSE); (* Kein Rand *)
a := MagicVDI.SetFillinterior (PrivateWS, 1); (* fllen *)
a := SetLinecolor (PrivateWS, 1);
END Circle3D;
TYPE ButtonType = (circle, radio, other);
PROCEDURE Image (x, y: sINTEGER; typ: ButtonType; sel: BOOLEAN; check : BOOLEAN);
(* Bringt die Images auf den Bildschirm *)
VAR m: MFDB;
h: sINTEGER;
BEGIN
IF (CharHeight = 16) OR (CharHeight = 8)
THEN
(* Fertige Images blitten *)
IF typ = circle THEN
IF CharHeight < 16 THEN h:= 7; m.fdAddr:= fCircle[sel];
ELSE h:= 15; m.fdAddr:= mCircle[sel];
END;
ELSIF typ = radio THEN
IF CharHeight < 16 THEN h:= 7; m.fdAddr:= fKnopf[sel];
ELSE h:= 15; m.fdAddr:= mKnopf[sel];
END;
ELSE
IF CharHeight < 16 THEN h:= 7; IF check & sel THEN m.fdAddr := fPunktEin ELSE m.fdAddr:= fSelect[sel]; END;
ELSE h:= 15; IF check & sel THEN m.fdAddr := mPunktEin ELSE m.fdAddr:= mSelect[sel]; END;
END;
END;
m.fdW:= 16;
m.fdH:= h;
m.fdWdwidth:= 1;
m.fdStand:= 0;
m.fdNplanes:= 1; (* Image hat nur eine Bitplane! *)
Rect (x, y, 16, h-1, 0); (* Vorlschen *)
VDIPtsIn[0]:= 0;
VDIPtsIn[1]:= 0;
VDIPtsIn[2]:= 15;
VDIPtsIn[3]:= h;
VDIPtsIn[4]:= x;
VDIPtsIn[5]:= y;
VDIPtsIn[6]:= x + 15;
VDIPtsIn[7]:= y + h-1;
control7^:= ADR(m);
control9^:= ADR(ScreenMFDB);
VDIIntIn[0]:= 3;
VDIIntIn[1]:= 1;
VDIIntIn[2]:= 0;
VDICall (121, 4, 3, 0, PrivateWS); (* RasterTransparent *)
ELSE
Rect (x, y, CharWidth*2, CharHeight-1, 0); (* Vorlschen *)
IF typ = circle
THEN
(* CircleButton zeichnen: Rechteck und darin Downarrow *)
Frame (x, y, CharWidth*2, CharHeight-1, 1);
Text (PrivateWS, x+CharWidth DIV 2, y+1, 02c+0c);
IF sel THEN
h:= SetWritemode (PrivateWS, XOR);
Rect (x+1, y+1, CharWidth*2 -2, Max (CharHeight - 3, 1), 1); (* Invert *)
h:= SetWritemode (PrivateWS, REPLACE);
END;
ELSIF typ = radio
THEN
(* Radiobutton: Bei Gren < 12 Punkt Rechteck Outlined und Innenflche gefllt oder nicht,
* ansonsten Kreise zeichnen
*)
IF (CharHeight < 12)
THEN
Frame (x+2, y+2, Max (CharWidth*2-4, 1), Max (CharHeight-4, 1), 1);
Frame (x+4, y+4, Max (CharWidth*2-8, 1), Max (CharHeight-8, 1), 1);
IF sel
THEN
(* Fllen *)
Rect (x+4, y+4, Max (CharWidth*2-8, 1), Max (CharHeight-8, 1), 1);
END;
ELSE
(* Kreise malen *)
Circle (x+2, y+2, Max (CharWidth*2-4,1), Max (CharHeight-4, 1), 1, FALSE);
IF sel
THEN
(* Fllen *)
Circle (x+5, y+5, Max (CharWidth*2 - 10, 1), Max (CharHeight - 10, 1), 1, TRUE);
END;
END;
ELSE
(* Checkboxen: Rechteck, ggf. gefllt oder Linien durch *)
Frame (x+2, y+2, Max (CharWidth*2-4, 1), Max (CharHeight-4, 1), 1);
IF check & sel
THEN
(* mit Punkten fllen *)
h:= MagicVDI.SetFillcolor (PrivateWS, 1); (* Fllfarbe schwarz *)
h:= MagicVDI.SetFillinterior (PrivateWS, 2); (* Flltyp auswhlen *)
h:= MagicVDI.SetFillstyle (PrivateWS, 1); (* Fll Style Index setzen *)
Rect (x+2, y+2, Max (CharWidth*2-4, 1), Max (CharHeight - 4, 1), 1); (* Fllen *)
h:= MagicVDI.SetFillcolor (PrivateWS, 0); (* Fllfarbe wei *)
h:= MagicVDI.SetFillinterior (PrivateWS, 1); (* Flltyp auswhlen *)
h:= MagicVDI.SetFillstyle (PrivateWS, 0); (* Fll Style Index setzen *)
ELSIF sel
THEN
(* Linien ber Kreuz malen *)
Line (x+2, y+2, CharWidth*2-4, CharHeight-4);
Line (x+CharWidth*2-2, y+2, -CharWidth*2+4, CharHeight-4);
END;
END;
END;
END Image;
PROCEDURE Image3D (x, y: sINTEGER; typ: ButtonType; sel: BOOLEAN; check : BOOLEAN);
(* Bringt die Images auf den Bildschirm *)
VAR m: MFDB;
h: sINTEGER;
BEGIN
IF ((CharHeight = 16) OR (CharHeight = 8))
& (typ # other) & (typ # radio)
THEN
(* Fertige Images blitten *)
IF typ = circle THEN
IF CharHeight < 16 THEN h:= 7; m.fdAddr:= fCircle[sel];
ELSE h:= 15; m.fdAddr:= mCircle[sel];
END;
ELSIF typ = radio THEN
IF CharHeight < 16 THEN h:= 7; m.fdAddr:= fKnopf[sel];
ELSE h:= 15; m.fdAddr:= mKnopf[sel];
END;
ELSE
IF CharHeight < 16 THEN h:= 7; IF check & sel THEN m.fdAddr := fPunktEin ELSE m.fdAddr:= fSelect[sel]; END;
ELSE h:= 15; IF check & sel THEN m.fdAddr := mPunktEin ELSE m.fdAddr:= mSelect[sel]; END;
END;
END;
m.fdW:= 16;
m.fdH:= h;
m.fdWdwidth:= 1;
m.fdStand:= 0;
m.fdNplanes:= 1; (* Image hat nur eine Bitplane! *)
Rect (x, y, 16, h-1, 8); (* Vorlschen *)
VDIPtsIn[0]:= 0;
VDIPtsIn[1]:= 0;
VDIPtsIn[2]:= 15;
VDIPtsIn[3]:= h;
VDIPtsIn[4]:= x;
VDIPtsIn[5]:= y;
VDIPtsIn[6]:= x + 15;
VDIPtsIn[7]:= y + h-1;
control7^:= ADR(m);
control9^:= ADR(ScreenMFDB);
VDIIntIn[0]:= 2;
VDIIntIn[1]:= 1;
VDIIntIn[2]:= 8;
VDICall (121, 4, 3, 0, PrivateWS); (* RasterTransparent *)
ELSE
Rect (x, y, CharWidth*2, CharHeight-1, 8); (* Vorlschen *)
IF typ = circle
THEN
(* CircleButton zeichnen: Rechteck und darin Downarrow *)
Frame (x, y, CharWidth*2, CharHeight-1, 1);
h:= SetWritemode (PrivateWS, TRANSPARENT);
Text (PrivateWS, x+CharWidth DIV 2, y+1, 02c+0c);
IF sel THEN
h:= SetWritemode (PrivateWS, XOR);
Rect (x+1, y+1, CharWidth*2 -2, Max (CharHeight - 3, 1), 1); (* Invert *)
END;
h:= SetWritemode (PrivateWS, REPLACE);
ELSIF typ = radio
THEN
(* Radiobutton: Bei Gren < 12 Punkt Rechteck Outlined und Innenflche gefllt oder nicht,
* ansonsten Kreise zeichnen
*)
IF (CharHeight < 12)
THEN
IF sel
THEN
Frame3D (x+2, y+2, Max (CharWidth*2-4, 1), Max (CharHeight-4, 1), 1, 9, 0);
Rect (x+4, y+4, Max (CharWidth*2-8, 1), Max (CharHeight-8, 1), 1);
ELSE
Frame3D (x+2, y+2, Max (CharWidth*2-4, 1), Max (CharHeight-4, 1), 1, 0, 9);
END;
ELSE
(* Kreise malen *)
Circle3D (x+2, y+2, Max (CharWidth*2-4,1), Max (CharHeight-4, 1), sel);
END;
ELSE
(* Checkboxen: Rechteck, ggf. gefllt oder Linien durch *)
IF sel
THEN
Frame3D (x+2, y+2, Max (CharWidth*2-4, 1), Max (CharHeight-4, 1), 1, 9, 0);
IF check
THEN
(* mit Punkten fllen *)
h:= SetWritemode (PrivateWS, TRANSPARENT);
h:= MagicVDI.SetFillcolor (PrivateWS, 1); (* Fllfarbe schwarz *)
h:= MagicVDI.SetFillinterior (PrivateWS, 2); (* Flltyp auswhlen *)
h:= MagicVDI.SetFillstyle (PrivateWS, 1); (* Fll Style Index setzen *)
Rect (x+2, y+2, Max (CharWidth*2-4, 1), Max (CharHeight - 4, 1), 1); (* Fllen *)
h:= MagicVDI.SetFillcolor (PrivateWS, 0); (* Fllfarbe wei *)
h:= MagicVDI.SetFillinterior (PrivateWS, 1); (* Flltyp auswhlen *)
h:= MagicVDI.SetFillstyle (PrivateWS, 0); (* Fll Style Index setzen *)
h:= SetWritemode (PrivateWS, REPLACE);
(* Innen mit dunkel fllen *)
(* Rect (x+3, y+3, Max (CharWidth*2-6, 1), Max (CharHeight-6, 1), 9); *)
ELSE
(* Linien ber Kreuz malen *)
Line (x+2, y+2, CharWidth*2-4, CharHeight-4);
Line (x+2, y+3, CharWidth*2-5, CharHeight-5);
Line (x+CharWidth*2-2, y+2, -CharWidth*2+4, CharHeight-4);
Line (x+CharWidth*2-2, y+3, -CharWidth*2+5, CharHeight-5);
END;
ELSE
Frame3D (x+2, y+2, Max (CharWidth*2-4, 1), Max (CharHeight-4, 1), 1, 0, 9);
END;
END;
END;
END Image3D;
PROCEDURE String (xx, yy, ww: sINTEGER; VAR string: ARRAY OF CHAR;
flags: sBITSET; center: BOOLEAN): sINTEGER;
(* Zeichnet einen String, scannt dabei auch nach den '['-Shortcuts.
* Dadurch werden nur Shortcuts erkannt, die auch gezeichnet wurden!
*)
VAR pos, i, j: sINTEGER;
(*$Reg*) len: sINTEGER;
(*$Reg*) c: sINTEGER;
eff: sBITSET;
old: ADDRESS;
ch: CHAR;
bs: BITSET;
str: ARRAY [0..255] OF sINTEGER;
BEGIN
c:= 0; len:= 0; pos:= -1; ch:= 0C;
IF SELECTED IN flags THEN
i:= SetWritemode (PrivateWS, XOR);
ELSE
i:= SetWritemode (PrivateWS, TRANSPARENT);
END;
LOOP
IF string[c] = 0C THEN str[len]:= 0; EXIT; END;
IF string[c] = ShortCut THEN
pos:= c * ChWidth; INC (c); ch:= CAP (string[c]);
END;
str[len]:= ORD(string[c]); INC (c); INC (len);
END;
IF center THEN i:= (ww - (len * ChWidth)) DIV 2; ELSE i:= 0; END;
eff:= {};
IF DISABLED IN flags THEN INCL (eff, Light); END;
IF DRAW3D IN flags THEN INCL (eff, Fat); END;
bs:= SetTexteffect (PrivateWS, eff);
old:= MagicVDI.VDIPB.intin;
MagicVDI.VDIPB.intin:= ADR (str);
VDIPtsIn[0]:= xx + i;
VDIPtsIn[1]:= yy;
VDICall(8, 1, len, 0, PrivateWS);
MagicVDI.VDIPB.intin:= old;
IF pos >= 0 THEN
IF DISABLED IN flags
THEN
j := MagicVDI.SetLinetype (PrivateWS, MagicVDI.User);
MagicVDI.SetUserlinestyle (PrivateWS, $5555);
END;
Line (xx + i + pos - 1, yy + CharHeight - 1, ChWidth, 0);
IF DISABLED IN flags
THEN
i := MagicVDI.SetLinetype (PrivateWS, MagicVDI.Line);
END;
END; (* IF pos *)
(*
IF SELECTED IN flags THEN i:= SetWritemode (PrivateWS, REPLACE); END;
*)
i:= SetWritemode (PrivateWS, REPLACE);
bs:= SetTexteffect (PrivateWS, {});
(* Shortcut-Zeichen in Scancode wandeln *)
CASE ORD (ch) OF
48..57, 65..90: RETURN scancodes[ORD(ch)];|
ELSE RETURN 0; (* Illegaler Shortcut!!! *);
END;
END String;
PROCEDURE String3D (xx, yy, ww: sINTEGER; VAR string: ARRAY OF CHAR;
flags: sBITSET; center: BOOLEAN; textmove: BOOLEAN): sINTEGER;
(* Zeichnet einen String, scannt dabei auch nach den '['-Shortcuts.
* Dadurch werden nur Shortcuts erkannt, die auch gezeichnet wurden!
*)
VAR pos, i, j: sINTEGER;
(*$Reg*) len: sINTEGER;
(*$Reg*) c: sINTEGER;
eff: sBITSET;
old: ADDRESS;
ch: CHAR;
bs: BITSET;
str: ARRAY [0..255] OF sINTEGER;
BEGIN
c:= 0; len:= 0; pos:= -1; ch:= 0C;
IF textmove & (SELECTED IN flags) THEN INC (xx); INC (yy); END;
i := SetWritemode (PrivateWS, TRANSPARENT);
LOOP
IF string[c] = 0C THEN str[len]:= 0; EXIT; END;
IF string[c] = ShortCut THEN
pos:= c * ChWidth; INC (c); ch:= CAP (string[c]);
END;
str[len]:= ORD(string[c]); INC (c); INC (len);
END;
IF center THEN i:= (ww - (len * ChWidth)) DIV 2; ELSE i:= 0; END;
eff:= {};
IF DISABLED IN flags THEN INCL (eff, Light); END;
IF DRAW3D IN flags THEN INCL (eff, Fat); END;
bs:= SetTexteffect (PrivateWS, eff);
old:= MagicVDI.VDIPB.intin;
MagicVDI.VDIPB.intin:= ADR (str);
VDIPtsIn[0]:= xx + i;
VDIPtsIn[1]:= yy;
VDICall(8, 1, len, 0, PrivateWS);
MagicVDI.VDIPB.intin:= old;
IF pos >= 0 THEN
IF DISABLED IN flags
THEN
j := MagicVDI.SetLinetype (PrivateWS, MagicVDI.User);
MagicVDI.SetUserlinestyle (PrivateWS, $5555);
END;
Line (xx + i + pos - 1, yy + CharHeight - 1, ChWidth, 0);
IF DISABLED IN flags
THEN
i := MagicVDI.SetLinetype (PrivateWS, MagicVDI.Line);
END;
END; (* IF pos *)
i := SetWritemode (PrivateWS, REPLACE);
bs:= SetTexteffect (PrivateWS, {});
(* Shortcut-Zeichen in Scancode wandeln *)
CASE ORD (ch) OF
48..57, 65..90: RETURN scancodes[ORD(ch)];|
ELSE RETURN 0; (* Illegaler Shortcut!!! *);
END;
END String3D;
PROCEDURE Shadow (x, y, w, h, times: sINTEGER);
(* Zeichnet einen Schatten an ein Objekt, times bestimmt die Dicke *)
VAR i: sINTEGER;
BEGIN
FOR i:= 1 TO times DO
INC (w); INC (h);
VDIPtsIn[0]:= x;
VDIPtsIn[1]:= y + h;
VDIPtsIn[2]:= x + w;
VDIPtsIn[3]:= VDIPtsIn[1]; (* y + h; *)
VDIPtsIn[4]:= VDIPtsIn[2]; (* x + w; *)
VDIPtsIn[5]:= y;
VDICall(6, 3, 0, 0, PrivateWS);
END;
END Shadow;
(*-----------------------------------------------------------------------*)
(*
PROCEDURE DrawBox (p: PtrPARMBLK): sBITSET;
(* Zeichnet eine BOX, IBOX oder BOXCHAR *)
VAR i: sINTEGER;
t: tObjcTree;
d: DIALOG;
BEGIN
t:= p^.pbTree; d:= mtXobjects.GetPrivate (p^.pbTree, p^.pbObj);
selected:= SELECTED IN p^.prCurrstate;
WITH t^[p^.pbObj] DO
END;
END DrawBox;
*)
PROCEDURE DrawMover (p: PtrPARMBLK): sBITSET;
(* zeichnet die Movebox *)
VAR i: sINTEGER;
t: tObjcTree;
d: DIALOG;
BEGIN
t:= p^.pbTree; d:= mtXobjects.GetPrivate (p^.pbTree, p^.pbObj);
WITH t^[p^.pbObj] DO
DEC (p^.pbX); i:= 4;
Rect (p^.pbX - 2, p^.pbY - 2, 2, p^.pbH, 0);
Rect (p^.pbX - 2, p^.pbY + p^.pbH, p^.pbW + 2, 2, 0);
VDIPtsIn[ 0]:= p^.pbX - 3;
VDIPtsIn[ 1]:= p^.pbY - 3;
VDIPtsIn[ 2]:= p^.pbX + p^.pbW + 3;
VDIPtsIn[ 3]:= p^.pbY + p^.pbH + 3;
VDIPtsIn[ 4]:= VDIPtsIn[0];
VDIPtsIn[ 5]:= VDIPtsIn[3];
VDIPtsIn[ 6]:= VDIPtsIn[0];
VDIPtsIn[ 7]:= VDIPtsIn[1];
(* IF cMove IN d^.flags THEN *)
i:= 7;
VDIPtsIn[ 8]:= p^.pbX;
VDIPtsIn[ 9]:= p^.pbY;
VDIPtsIn[10]:= p^.pbX;
VDIPtsIn[11]:= p^.pbY + p^.pbH;
VDIPtsIn[12]:= p^.pbX + p^.pbW;
VDIPtsIn[13]:= VDIPtsIn[11];
(* END; *)
VDICall(6, i, 0, 0, PrivateWS);
END;
RETURN {};
END DrawMover;
PROCEDURE DrawButton (p: PtrPARMBLK): sBITSET;
(* Zeichnet einen Knopf, eine Crossbox oder einen Button *)
VAR thick, off, roff, col, ch, bh, i, j: sINTEGER;
selected, center: BOOLEAN;
t: tObjcTree;
obspec: Objcspec;
butt: ButtonType;
r : tRect;
BEGIN
t:= p^.pbTree; obspec.address:= p^.pbParm;
selected:= SELECTED IN p^.prCurrstate;
WITH t^[p^.pbObj] DO
IF (cCoords IN t^[p^.pbObj].obFlags)
THEN
WITH r DO
x := p^.pbX + 4;
y := p^.pbY + 4;
w := p^.pbW - 8;
h := p^.pbH - 8;
END;
ELSE
WITH r DO
x := p^.pbX;
y := p^.pbY;
w := p^.pbW;
h := p^.pbH;
END;
END;
IF (RBUTTON IN obFlags) OR NOT (Exit IN obFlags) THEN
(* Knopf bzw. Crossbox zeichnen *)
(* Rect (p^.pbX, p^.pbY, p^.pbW, p^.pbH-1 , 0); (* Vorlschen *) *)
Rect (r.x, r.y, r.w, r.h-1 , 0); (* Vorlschen *)
IF RBUTTON IN obFlags THEN butt:= radio ELSE butt:= other END;
(* Image (p^.pbX, p^.pbY, butt, selected, FALSE); *)
Image (r.x, r.y, butt, selected, FALSE);
roff:= ROffset; center:= FALSE;
ELSIF (Exit IN obFlags) THEN (* "richtiger" Button *)
IF selected THEN col:= 1; ELSE col:= 0; END;
(* Rect (p^.pbX, p^.pbY, p^.pbW, p^.pbH, col); (* Vorlschen *) *)
Rect (r.x, r.y, r.w, r.h , col); (* Vorlschen *)
roff:= 0; center:= TRUE;
IF DEFAULT IN obFlags THEN thick:= 3;
ELSIF Exit IN obFlags THEN thick:= 2;
ELSE thick:= 1;
END;
(* Frame (p^.pbX, p^.pbY, p^.pbW, p^.pbH, thick); *)
Frame (r.x, r.y, r.w, r.h, thick);
IF SHADOWED IN obState THEN
(* Shadow (p^.pbX, p^.pbY, p^.pbW, p^.pbH, thick * 2); *)
Shadow (r.x, r.y, r.w, r.h, thick * 2);
END;
END;
(* IF obHeight > CharHeight THEN off:= (obHeight - CharHeight) DIV 2; *)
IF r.h > CharHeight THEN off:= (r.h - CharHeight) DIV 2;
ELSE off:= 0;
END;
IF CHECKED IN p^.prCurrstate THEN
j:= MagicVDI.SetCharpoints (PrivateWS, 1, ChWidth, i, i, bh);
(* off:= (obHeight DIV 2) - 2; center:= TRUE; *)
off:= (r.h DIV 2) - 2; center:= TRUE;
END;
(* ch:= String (p^.pbX + roff, p^.pbY + off, p^.pbW, *)
ch:= String (r.x + roff, r.y + off, r.w,
obspec.StringPtr^, p^.prCurrstate, center);
SetUserkey (t, p^.pbObj, ch, ShortKey, TRUE, TRUE);
IF CHECKED IN p^.prCurrstate THEN
SetCharheight (PrivateWS, ChSize, i, i, i, i);
ChWidth:= CharWidth;
END;
END;
RETURN {};
END DrawButton;
PROCEDURE Draw3DButton (p: PtrPARMBLK): sBITSET;
(* Zeichnet einen Knopf, eine Crossbox oder einen Button *)
VAR thick, off, roff, col, ch, bh, i, j: sINTEGER;
selected, center: BOOLEAN;
t: tObjcTree;
obspec: Objcspec;
butt: ButtonType;
r : tRect;
realButt : BOOLEAN;
BEGIN
t:= p^.pbTree; obspec.address:= p^.pbParm;
selected:= SELECTED IN p^.prCurrstate;
realButt := FALSE;
WITH t^[p^.pbObj] DO
IF (cCoords IN t^[p^.pbObj].obFlags)
THEN
WITH r DO
x := p^.pbX + 4;
y := p^.pbY + 4;
w := p^.pbW - 8;
h := p^.pbH - 8;
END;
ELSE
WITH r DO
x := p^.pbX;
y := p^.pbY;
w := p^.pbW;
h := p^.pbH;
END;
END;
IF (RBUTTON IN obFlags) OR NOT (Exit IN obFlags) THEN
(* Knopf bzw. Crossbox zeichnen *)
(* Rect (p^.pbX, p^.pbY, p^.pbW, p^.pbH-1 , 0); (* Vorlschen *) *)
Rect (r.x, r.y, r.w, r.h-1 , 8); (* Vorlschen *)
IF RBUTTON IN obFlags THEN butt:= radio ELSE butt:= other END;
(* Image (p^.pbX, p^.pbY, butt, selected, FALSE); *)
Image3D (r.x, r.y, butt, selected, FALSE);
(*
IF butt = radio
THEN
Image3D (r.x, r.y, butt, selected, FALSE);
ELSE
(* Checkboxen: Rechteck, ggf. gefllt oder Linien durch *)
IF selected
THEN
Frame3D (r.x+2, r.y+2, Max (CharWidth*2-4, 1), Max (CharHeight-4, 1), 1, 9, 0);
(* Linien ber Kreuz malen *)
Line (r.x+2, r.y+2, CharWidth*2-4, CharHeight-4);
Line (r.x+2, r.y+3, CharWidth*2-5, CharHeight-5);
Line (r.x+CharWidth*2-2, r.y+2, -CharWidth*2+4, CharHeight-4);
Line (r.x+CharWidth*2-2, r.y+3, -CharWidth*2+5, CharHeight-5);
ELSE
Frame3D (r.x+2, r.y+2, Max (CharWidth*2-4, 1), Max (CharHeight-4, 1), 1, 0, 9);
END;
END;
*)
roff:= ROffset; center:= FALSE;
ELSIF (Exit IN obFlags) THEN (* "richtiger" Button *)
realButt := TRUE;
col := 8;
(* Rect (p^.pbX, p^.pbY, p^.pbW, p^.pbH, col); (* Vorlschen *) *)
Rect (r.x, r.y, r.w, r.h , col); (* Vorlschen *)
roff:= 0; center:= TRUE;
IF DEFAULT IN obFlags THEN thick:= 2;
ELSE thick:= 1;
END;
(* 3D-Rahmen zeichnen *)
IF selected
THEN
Frame3D (r.x, r.y, r.w, r.h, thick, 9, 0);
ELSE
Frame3D (r.x, r.y, r.w, r.h, thick, 0, 9);
END;
(* Dnnen schwarzen Rand zeichnen *)
Frame (r.x-thick, r.y-thick, r.w+thick*2, r.h+thick*2, 1);
IF SHADOWED IN obState THEN
(* Shadow (p^.pbX, p^.pbY, p^.pbW, p^.pbH, thick * 2); *)
Shadow (r.x, r.y, r.w, r.h, thick * 2);
END;
END;
(* IF obHeight > CharHeight THEN off:= (obHeight - CharHeight) DIV 2; *)
IF r.h > CharHeight THEN off:= (r.h - CharHeight) DIV 2;
ELSE off:= 0;
END;
IF CHECKED IN p^.prCurrstate THEN
j:= MagicVDI.SetCharpoints (PrivateWS, 1, ChWidth, i, i, bh);
(* off:= (obHeight DIV 2) - 2; center:= TRUE; *)
off:= (r.h DIV 2) - 2; center:= TRUE;
END;
(* ch:= String (p^.pbX + roff, p^.pbY + off, p^.pbW, *)
ch:= String3D (r.x + roff, r.y + off, r.w,
obspec.StringPtr^, p^.prCurrstate, center, realButt);
SetUserkey (t, p^.pbObj, ch, ShortKey, TRUE, TRUE);
IF CHECKED IN p^.prCurrstate THEN
SetCharheight (PrivateWS, ChSize, i, i, i, i);
ChWidth:= CharWidth;
END;
END;
RETURN {};
END Draw3DButton;
PROCEDURE DrawText (p: PtrPARMBLK): sBITSET;
TYPE Typeset = SET OF [GBOX..GTITLE];
VAR i, l, col, bh, ch: sINTEGER;
eff: sBITSET;
t: tObjcTree;
obspec: Objcspec;
strPtr: MagicAES.PtrSTRING;
PROCEDURE Write (x, y, col: sINTEGER; REF str: ARRAY OF CHAR);
BEGIN
i:= SetTextcolor (PrivateWS, col);
Text (PrivateWS, x, y, str);
END Write;
BEGIN
t:= p^.pbTree; obspec.address:= p^.pbParm; eff:= {};
WITH t^[p^.pbObj] DO
(* Objecttyp holen *)
i := GetLowbyte(mtXobjects.GetObtype (t, p^.pbObj));
IF i IN Typeset {GTEXT, GBOXTEXT, GFTEXT, GFBOXTEXT} THEN
strPtr := MagicAES.PtrSTRING(obspec.TedPtr^.tePtext)
ELSIF i = GSTRING
THEN
strPtr := obspec.StringPtr
ELSE
RETURN {};
END;
IF (SELECTED IN p^.prCurrstate) AND NOT (WHITEBAK IN p^.prCurrstate) THEN
col:= 1 ELSE col:= 0
END;
IF CHECKED IN obState THEN
i:= MagicVDI.SetCharpoints (PrivateWS, 1, ChWidth, i, i, bh);
ELSE
bh:= obHeight;
END;
(*
IF mode3D
THEN
col := 8;
END;
Rect (p^.pbX, p^.pbY, p^.pbW-1, bh-1, col);
*)
IF WHITEBAK IN p^.prCurrstate THEN (* Zeichnet Shadowtext *)
i:= SetWritemode (PrivateWS, TRANSPARENT);
Write (p^.pbX + 2, p^.pbY + 2, 1, strPtr^);
Write (p^.pbX + 1, p^.pbY + 1, 0, strPtr^);
Write (p^.pbX, p^.pbY, 1, strPtr^);
(*
Write (p^.pbX + 2, p^.pbY + 2, 1, obspec.StringPtr^);
Write (p^.pbX + 1, p^.pbY + 1, 0, obspec.StringPtr^);
Write (p^.pbX, p^.pbY, 1, obspec.StringPtr^);
*)
i:= SetWritemode (PrivateWS, REPLACE);
ELSE
(*
ch:= String (p^.pbX, p^.pbY, p^.pbW, obspec.StringPtr^,
*)
ch:= String (p^.pbX, p^.pbY, p^.pbW, strPtr^,
p^.prCurrstate, FALSE);
IF (SELECTABLE IN obFlags) OR (TOUCHEXIT IN obFlags) THEN
(* Anwhlbar, also auch Shortcut eintragen! *)
SetUserkey (t, p^.pbObj, ch, ShortKey, TRUE, TRUE);
END;
IF (SHADOWED IN p^.prCurrstate) OR (OUTLINED IN p^.prCurrstate) THEN
(*
ObjcStrLen (t, p^.pbObj, l, i);
l:= l * ChWidth; l:= Max (l, obWidth);
l := LENGTH (obspec.StringPtr^);
WHILE (l > 0) & (obspec.StringPtr^[l-1]=' ') DO DEC (l) END;
*)
l := LENGTH (strPtr^);
WHILE (l > 0) & (strPtr^[l-1]=' ') DO DEC (l) END;
l := l * ChWidth;
Line (p^.pbX, p^.pbY + bh, l, 0);
IF OUTLINED IN p^.prCurrstate THEN
Line (p^.pbX, p^.pbY + bh + 2, l, 0);
END;
END;
SetCharheight (PrivateWS, ChSize, i, i, i, i);
eff:= SetTexteffect (PrivateWS, {});
ChWidth:= CharWidth;
END;
END;
RETURN {};
END DrawText;
(* Eine Zeichenfunktion, um ein Textobject zu zeichnen
*)
PROCEDURE BuildStr (REF text, tmplt : ARRAY OF CHAR; offs, maxLen: sINTEGER;
VAR str: ARRAY OF CHAR);
VAR i, j, k : sINTEGER;
BEGIN
i := 0;
WHILE (i < maxLen) & (tmplt[i] # '_') & (tmplt[i] # '') DO
str[i] := tmplt[i];
INC (i);
END;
k := i;
(* Zeichen bis offs in text berspringen *)
j := 0;
WHILE (text[j] # '') & (j < offs) DO
INC (j);
END;
WHILE (i < maxLen) DO
IF text[j] = ''
THEN
(* tmplt kopieren *)
str[i] := tmplt [i+k];
ELSE
str[i] := text[j];
INC (j);
END;
INC (i);
END;
IF text[j] # ''
THEN
str[i] := CHR(3);
INC (i);
ELSE
str[i] := ' ';
INC (i);
END;
str[i] := '';
END BuildStr;
PROCEDURE DrawEdText (p: PtrPARMBLK): sBITSET;
TYPE Typeset = SET OF [GBOX..GTITLE];
VAR i, l, col, bh, ch: sINTEGER;
eff: sBITSET;
t: tObjcTree;
obspec: Objcspec;
textPtr: MagicAES.PtrTEDINFO;
offset : sINTEGER;
x, y, w, h: INTEGER;
maxLen: INTEGER;
obW : INTEGER;
BEGIN
t:= p^.pbTree; obspec.address:= p^.pbParm; eff:= {};
WITH t^[p^.pbObj] DO
obW := obWidth;
IF (cCoords IN t^[p^.pbObj].obFlags)
THEN
DEC (obW, ChWidth);
END;
(* Objecttyp holen *)
i := GetLowbyte(mtXobjects.GetObtype (t, p^.pbObj));
IF i IN Typeset {GTEXT, GBOXTEXT, GFTEXT, GFBOXTEXT} THEN
textPtr := MagicAES.PtrTEDINFO (obspec.address);
ELSE
RETURN {};
END;
IF (SELECTED IN p^.prCurrstate) AND NOT (WHITEBAK IN p^.prCurrstate) THEN
col:= 1 ELSE col:= 0
END;
(*
Rect (p^.pbX, p^.pbY, p^.pbW-1 + ChWidth, obHeight-1, col);
*)
IF textPtr^.teFont = MagicAES.SMALL
THEN
i := MagicVDI.SetCharpoints (PrivateWS, 1, w, i, i, h);
ELSE
w := ChWidth;
h := CharHeight;
END;
Rect (p^.pbX + obW-1, p^.pbY, ChWidth, obHeight-1, col);
maxLen := Min (obW DIV ChWidth, LENGTH (textPtr^.tePtmplt^));
BuildStr (textPtr^.tePtext^, textPtr^.tePtmplt^, textPtr^.teFontid, maxLen, theText);
y := p^.pbY;
INC (y, (p^.pbH - CharHeight) DIV 2);
x := p^.pbX;
Text (PrivateWS, x, y, theText);
SetCharheight (PrivateWS, ChSize, i, i, i, i);
(*
ch:= String (p^.pbX, p^.pbY, p^.pbW, theText,
p^.prCurrstate, FALSE);
*)
RETURN {};
END;
END DrawEdText;
PROCEDURE DrawFrame (p: PtrPARMBLK): sBITSET;
VAR eff: sBITSET;
i, j, size, off, off2, col: sINTEGER;
minA, maxA, maxW, ch, cw: sINTEGER;
c: CARDINAL;
t: tObjcTree;
obspec: Objcspec;
PROCEDURE Center (cw: sINTEGER): sINTEGER;
BEGIN
IF CROSSED IN p^.prCurrstate THEN
c:= Length (obspec.StringPtr^); j:= CastToInt (c);
i:= p^.pbX + (p^.pbW - (j * cw)) DIV 2;
ELSE
i:= p^.pbX + (cw DIV 2);
END;
RETURN i;
END Center;
BEGIN
t:= p^.pbTree; obspec.address:= p^.pbParm; eff:= {};
WITH t^[p^.pbObj] DO
IF SELECTED IN obState THEN col:= 1 ELSE col:= 0 END;
Rect (p^.pbX, p^.pbY, p^.pbW, p^.pbH, col);
Frame (p^.pbX, p^.pbY, p^.pbW, p^.pbH, 1);
IF SHADOWED IN obState THEN
Shadow (p^.pbX, p^.pbY, p^.pbW, p^.pbH, 3);
END;
IF OUTLINED IN obState THEN
Frame (p^.pbX + 2, p^.pbY + 2, p^.pbW - 4, p^.pbH - 4, 1);
END;
IF SELECTED IN obState THEN i:= SetWritemode (PrivateWS, XOR); END;
IF DISABLED IN obState THEN INCL (eff, Light); END;
IF DRAW3D IN obState THEN INCL (eff, Fat); END;
eff:= SetTexteffect (PrivateWS, eff);
IF CHECKED IN obState THEN
j:= MagicVDI.SetCharpoints (PrivateWS, 1, j, j, j, j);
off:= Center (6); off2:= 3;
ELSE
off:= Center (ChWidth); off2:= 0;
END;
Text (PrivateWS, off, p^.pbY - (CharHeight DIV 2) + off2, obspec.StringPtr^);
SetCharheight (PrivateWS, ChSize, j, j, j, j);
i:= SetWritemode (PrivateWS, REPLACE);
END;
RETURN {};
END DrawFrame;
PROCEDURE Draw3DFrame (p: PtrPARMBLK): sBITSET;
VAR eff: sBITSET;
i, j, size, off, off2, col: sINTEGER;
minA, maxA, maxW, ch, cw: sINTEGER;
c: CARDINAL;
t: tObjcTree;
obspec: Objcspec;
width : INTEGER;
PROCEDURE Center (cw: sINTEGER): sINTEGER;
BEGIN
c:= Length (obspec.StringPtr^);
IF CHECKED IN p^.prCurrstate
THEN
width := Length (obspec.StringPtr^) * 6;
ELSE
width := Length (obspec.StringPtr^) * 8;
END;
IF CROSSED IN p^.prCurrstate THEN
j:= CastToInt (c);
i:= p^.pbX + (p^.pbW - (j * cw)) DIV 2;
ELSE
i:= p^.pbX + (cw DIV 2);
END;
RETURN i;
END Center;
BEGIN
t:= p^.pbTree; obspec.address:= p^.pbParm; eff:= {};
WITH t^[p^.pbObj] DO
IF SELECTED IN obState THEN
Frame3D (p^.pbX, p^.pbY, p^.pbW, p^.pbH, 1, 9, 0);
ELSE
Frame3D (p^.pbX, p^.pbY, p^.pbW, p^.pbH, 1, 0, 9);
END;
IF DISABLED IN obState THEN INCL (eff, Light); END;
IF DRAW3D IN obState THEN INCL (eff, Fat); END;
eff:= SetTexteffect (PrivateWS, eff);
IF CHECKED IN obState THEN
j:= MagicVDI.SetCharpoints (PrivateWS, 1, j, j, j, j);
off:= Center (6); off2:= 3;
ELSE
off:= Center (ChWidth); off2:= 0;
END;
Rect (off, p^.pbY - (CharHeight DIV 2) + off2, width, (CharHeight DIV 2), 8);
i:= SetWritemode (PrivateWS, TRANSPARENT);
Text (PrivateWS, off, p^.pbY - (CharHeight DIV 2) + off2, obspec.StringPtr^);
SetCharheight (PrivateWS, ChSize, j, j, j, j);
i:= SetWritemode (PrivateWS, REPLACE);
END;
RETURN {};
END Draw3DFrame;
PROCEDURE DrawCircle (p: PtrPARMBLK): sBITSET;
VAR ex, ob: sINTEGER;
t: tObjcTree;
obspec: Objcspec;
ret : sBITSET;
BEGIN
t:= p^.pbTree; obspec.address:= p^.pbParm;
GetObjcExtype (t, p^.pbObj, ex, ob);
ret := {};
IF ob = GBOXCHAR THEN
Image (p^.pbX + 1, p^.pbY, circle, SELECTED IN p^.prCurrstate, FALSE);
Frame (p^.pbX + 1, p^.pbY, p^.pbW - 1, p^.pbH - 1, 1); (* GRUMBLE!!! *)
IF DISABLED IN p^.prCurrstate
THEN
INCL (ret, DISABLED);
END;
(*
IF SELECTED IN p^.prCurrstate
THEN
INCL (ret, SELECTED);
END;
*)
END;
RETURN ret;
END DrawCircle;
PROCEDURE DrawThreeState (p : PtrPARMBLK): sBITSET;
(* objc : tObjcTree; entry : sINTEGER); *)
(* Zeichnet Tree-State-Button:
* ~selected & ~checked: Leere Box
* selected & ~checked: angekreuzte Box
* selected & checked: gepunktete Box
*)
PROCEDURE swapFlag (VAR set: sBITSET; bit: sCARDINAL);
BEGIN
IF bit IN set THEN EXCL (set, bit); ELSE INCL (set, bit); END;
END swapFlag;
VAR x, y, thick, off, col, ch: sINTEGER;
t : tObjcTree;
obspec: Objcspec;
BEGIN
t := p^.pbTree; obspec.address:= p^.pbParm;
WITH p^ DO
IF pbH > CharHeight THEN off:= (pbH - CharHeight) DIV 2;
ELSE off:= 0;
END;
IF mode3D
THEN
Rect (pbX, pbY, pbW + ROffset, pbH-1, 8);
ch:= String3D (pbX + ROffset, pbY + off, pbW, obspec.StringPtr^, {}, FALSE, FALSE);
ELSE
Rect (pbX, pbY, pbW + ROffset, pbH-1, 0);
ch:= String (pbX + ROffset, pbY + off, pbW, obspec.StringPtr^, {}, FALSE);
END;
SetUserkey (t, p^.pbObj, ch, ShortKey, TRUE, TRUE);
IF prCurrstate # prPrevstate
THEN
(* Objekt wurde selektiert *)
IF (SELECTED IN prPrevstate) & (CHECKED IN prPrevstate)
THEN
swapFlag (prPrevstate, CHECKED);
(* Danach nur noch selected *)
ELSIF (SELECTED IN prPrevstate) & ~(CHECKED IN prPrevstate)
THEN
swapFlag (prPrevstate, SELECTED);
(* Danach weder SELECTED noch CHECKED *)
ELSIF ~(SELECTED IN prPrevstate)
THEN
swapFlag (prPrevstate, SELECTED);
IF ~(CHECKED IN prPrevstate)
THEN
(* ~selected & checked darf nicht sein! *)
swapFlag (prPrevstate, CHECKED);
END;
(* Hiernach SELECTED und CHECKED *)
END;
prCurrstate := prPrevstate;
t^[pbObj].obState := prCurrstate;
END;
IF CHECKED IN prCurrstate
THEN
(* angekreuzten Button zeichnen *)
IF mode3D
THEN
Image3D (pbX, pbY, other, TRUE, FALSE);
ELSE
Image (pbX, pbY, other, TRUE, FALSE);
END;
ELSE
IF mode3D
THEN
Image3D (pbX, pbY, other, ~(SELECTED IN prCurrstate), TRUE);
ELSE
Image (pbX, pbY, other, ~(SELECTED IN prCurrstate), TRUE);
END;
END;
END;
RETURN {}
END DrawThreeState;
(*----------------------------------------------------------------------*
* Folgende Prozeduren manipulieren in der Dialogliste *
*----------------------------------------------------------------------*)
PROCEDURE NewDial (tree: ADDRESS): BOOLEAN;
VAR q: DIALOG;
(*$Reg*) i: sINTEGER;
dial: DIALOG;
tr : tObjcTree;
ex, typ: sINTEGER;
b: BOOLEAN;
BEGIN
q:= GetDIALOG (tree);
IF q = NIL THEN (* Nur Neueintrge vornehmen *)
ALLOCATE (dial, TSIZE(Dialog));
IF dial = NIL THEN RETURN FALSE; END;
IF NOT NewAREA (dial^.back) THEN
DEALLOCATE (dial, 0); RETURN FALSE;
END;
IF NOT NewAREA (dial^.front) THEN
DisposeAREA (dial^.back); DEALLOCATE (dial, 0); RETURN FALSE;
END;
dial^.tree:= tree;
dial^.flags:= {};
dial^.next:= NIL;
dial^.pmode:= -1;
IF Dials = NIL THEN (* Erster Dialog *)
Dials:= dial;
ELSE (* Gibbet schon Dialoge *)
q:= Dials;
WHILE q^.next # NIL DO q:= q^.next; END;
q^.next:= dial;
END;
ResetUserkeys (tree);
i:= 0;
(* Baum scannen und Extended Objects installieren *)
tr := tree;
LOOP
GetObjcExtype (dial^.tree, i, ex, typ);
IF (ex = MoveBox) AND (typ = GIBOX) THEN
b:= mtXobjects.InstUserdef (tree, i, DrawMover, dial);
ELSIF ex = SpecButton THEN
IF mode3D
THEN
b:= mtXobjects.InstUserdef (tree, i, Draw3DButton, dial);
ELSE
b:= mtXobjects.InstUserdef (tree, i, DrawButton, dial);
END;
(* Objektkoordinaten anpassen *)
IF ~(cCoords IN tr^[i].obFlags)
THEN
WITH tr^[i] DO
DEC (obX, 4); DEC(obY, 4);
INC (obWidth, 8); INC (obHeight, 8);
INCL (obFlags, cCoords);
END;
END;
ELSIF ex = SpecText THEN
b:= mtXobjects.InstUserdef (tree, i, DrawText, dial);
ELSIF ex = FrameBox THEN
IF mode3D
THEN
b:= mtXobjects.InstUserdef (tree, i, Draw3DFrame, dial);
ELSE
b:= mtXobjects.InstUserdef (tree, i, DrawFrame, dial);
END;
ELSIF (ex = CircleButton) AND (typ = GBOXCHAR) THEN
b:= mtXobjects.InstUserdef (tree, i, DrawCircle, dial);
ELSIF (ex = ThreeState) THEN
b:= mtXobjects.InstUserdef (tree, i, DrawThreeState, dial);
ELSIF (ex = LongEdit) THEN
(* Test auf MagiC mit langen Editfeldern *)
IF IsMagiCScroll
THEN
(* Wir machen hier gar nichts, User mu die manuell
* initialisieren
*)
ELSE
b:= mtXobjects.InstUserdef (tree, i, DrawEdText, dial);
IF ~(cCoords IN tr^[i].obFlags)
THEN
WITH tr^[i] DO
INC (obWidth, CharWidth);
INCL (obFlags, cCoords);
END;
END;
END;
ELSE
b := TRUE
END;
IF ~b THEN
(* installierte Userdefs wieder deinstallieren *)
DisposeDial (tree);
RETURN FALSE
END;
IF LASTOB IN dial^.tree^[i].obFlags THEN
EXIT;
END;
INC (i);
END; (* LOOP *)
END; (* q = NIL *)
RETURN TRUE;
END NewDial;
PROCEDURE DisposeDial (tree: ADDRESS);
VAR (*$Reg*) p: DIALOG;
(*$Reg*) i: sINTEGER;
dial: DIALOG;
tr : tObjcTree;
ex, typ: sINTEGER;
BEGIN
dial:= GetDIALOG (tree);
tr := tree;
IF dial # NIL THEN
i:= 0;
LOOP
GetObjcExtype (dial^.tree, i, ex, typ);
IF (ex >= MoveBox) AND (ex <= ThreeState) THEN
mtXobjects.FreeUserdef (tree, i);
IF ex = SpecButton
THEN
(* Objektkoordinaten wieder zurcksetzen *)
IF (cCoords IN tr^[i].obFlags)
THEN
WITH tr^[i] DO
INC (obX, 4); INC(obY, 4);
DEC (obWidth, 8); DEC (obHeight, 8);
EXCL (obFlags, cCoords);
END;
END;
ELSIF ex = LongEdit
THEN
IF (cCoords IN tr^[i].obFlags)
THEN
WITH tr^[i] DO
DEC (obWidth, CharWidth);
EXCL (obFlags, cCoords);
END;
END;
END;
END;
IF LASTOB IN dial^.tree^[i].obFlags THEN
EXIT;
END;
INC (i);
END; (* LOOP *)
DisposeAREA (dial^.back);
DisposeAREA (dial^.front);
IF dial # Dials THEN
p:= Dials; WHILE p^.next # dial DO p:= p^.next; END;
p^.next:= dial^.next;
ELSE
Dials:= dial^.next;
END;
DEALLOCATE (dial, 0);
END;
END DisposeDial;
PROCEDURE DisposeDials;
BEGIN
WHILE Dials # NIL DO DisposeDial (Dials^.tree); END;
END DisposeDials;
PROCEDURE InstallHandler (tree: ADDRESS; proc: UserHandler;
callmode, timer, rmode: sINTEGER;
rect: ARRAY OF LOC; mesag: ADDRESS);
VAR dial: DIALOG;
r: POINTER TO ARRAY [0..3] OF sINTEGER;
BEGIN
dial:= GetDIALOG (tree);
IF dial # NIL THEN
IF (callmode > -1) AND (callmode <= CallByMessage) THEN
dial^.proc:= proc;
dial^.pmode:= callmode;
dial^.ptime:= timer;
dial^.prmod:= rmode;
r:= ADR (rect);
dial^.prect.x:= r^[0];
dial^.prect.y:= r^[1];
dial^.prect.w:= r^[2];
dial^.prect.h:= r^[3];
dial^.pmess:= mesag;
INCL (dial^.flags, cUser);
END;
END;
END InstallHandler;
PROCEDURE RemoveHandler (tree: ADDRESS);
VAR dial: DIALOG;
BEGIN
dial:= GetDIALOG (tree);
IF dial # NIL THEN
EXCL (dial^.flags, cUser); dial^.pmode:= -1;
END;
END RemoveHandler;
(*----------------------------------------------------------------------*
* Prozeduren unabhngig von der Dialogliste *
*----------------------------------------------------------------------*)
PROCEDURE DialDraw (tree: ADDRESS; entry, depth: sINTEGER;
cliprect: ARRAY OF LOC; clipping: BOOLEAN);
VAR p: POINTER TO tRect;
r: tRect;
BEGIN
MouseOff;
IF clipping THEN
p:= ADR (cliprect); r:= p^; AbsRect (r);
SetClipping (PrivateWS, r, TRUE);
ObjcDraw (tree, entry, depth, cliprect);
SetClipping (PrivateWS, r, FALSE);
ELSE
ObjcDraw (tree, entry, depth, screen);
END;
MouseOn;
END DialDraw;
PROCEDURE DialChange (tree: ADDRESS; entry, state: sINTEGER;
clip: ARRAY OF LOC; clipping, set, draw: BOOLEAN);
BEGIN
SetState (tree, entry, state, set);
IF draw THEN DialDraw (tree, entry, 0, clip, clipping); END;
END DialChange;
(*----------------------------------------------------------------------*
* Initalisierung des Dialogs *
*----------------------------------------------------------------------*)
PROCEDURE DialCenter (tree: ADDRESS; flag, xx, yy: sINTEGER;
VAR rect: ARRAY OF LOC);
TYPE PTRVscr = POINTER TO RECORD
cookie: ARRAY [0..3] OF CHAR;
product: ARRAY [0..3] OF CHAR;
version: sCARDINAL;
vx: sINTEGER;
vy: sINTEGER;
vw: sINTEGER;
vh: sINTEGER;
END;
VAR f: sINTEGER;
a: ADDRESS;
Vscr: PTRVscr;
bs: BITSET;
t: tObjcTree;
BEGIN
t:= tree;
IF flag = CPOS THEN
t^[0].obX:= xx; t^[0].obY:= yy;
ELSE
IF NOT (UsePos IN Config) THEN
(* Zentrieren *)
FormCenter (t, rect);
IF FindCookie (VirtualScreen, a) THEN
Vscr:= a;
IF Equal (VirtualScreen, Vscr^.cookie) THEN
t^[0].obX:= Vscr^.vx + (Vscr^.vw DIV 2) - (t^[0].obWidth DIV 2);
t^[0].obY:= Vscr^.vy + (Vscr^.vh DIV 2) - (t^[0].obHeight DIV 2);
END; (* IF Equal *)
END; (* IF FindCookie *)
IF UseMouse IN Config THEN
GrafMkstate (xx, yy, bs, bs);
t^[0].obX:= xx - (t^[0].obWidth DIV 2);
t^[0].obY:= yy - (t^[0].obHeight DIV 2);
END; (* IF UseMouse *)
END; (* IF NOT (UsePos IN Config *)
END; (* IF flag = CPOS *)
(* Screengrenzen prfen *)
f:= ObjcFrame (t, 0); IF f < 0 THEN f:= ABS (f) ELSE f:= 0; END;
WITH t^[0] DO
IF (obX + obWidth + f) > screen.w THEN obX:= screen.w - obWidth - f; END;
IF (obY + obHeight + f) > screen.h THEN obY:= screen.h - obHeight - f; END;
IF obX < screen.x + f THEN obX:= screen.x + f; END;
IF obY < screen.y + f THEN obY:= screen.y + f; END;
CalcArea (tree, 0, rect);
END;
END DialCenter;
PROCEDURE DialForm (tr: ADDRESS; flag: sINTEGER; VAR smll, big: ARRAY OF LOC);
VAR i: sINTEGER;
clp: tRect;
dial: DIALOG;
BEGIN
dial:= GetDIALOG (tr);
MouseOff;
IF dial # NIL THEN
CalcArea (dial^.tree, 0, clp);
CASE flag OF
DSTART: IF SaveArea (PrivateWS, dial^.back, clp) THEN
INCL (dial^.flags, cMove);
ELSE
FormDial (FMDSTART, small, clp);
END;
|
DGROW: IF UseGrowbox IN Config THEN FormDial (FMDGROW, smll, big); END;
|
DSHRINK: IF UseGrowbox IN Config THEN FormDial (FMDSHRINK, smll, big); END;
|
DFINISH: IF cMove IN dial^.flags THEN
RestoreArea (PrivateWS, dial^.back);
FreeArea (dial^.back);
EXCL (dial^.flags, cMove);
ELSE
FormDial (FMDFINISH, smll, clp);
END;
|
DDISABLE: IF SaveArea (PrivateWS, dial^.front, clp) THEN
INCL (dial^.flags, cRestore);
END;
MouseOff;
i:= SetWritemode (PrivateWS, MagicVDI.REVTRANSPARENT);
i:= MagicVDI.SetFillinterior (PrivateWS, 2);
i:= MagicVDI.SetFillstyle (PrivateWS, 4);
Rect (clp.x, clp.y, clp.w - 1, clp.h - 1, 0);
i:= MagicVDI.SetFillstyle (PrivateWS, 0);
i:= MagicVDI.SetFillinterior (PrivateWS, 1);
i:= SetWritemode (PrivateWS, REPLACE);
MouseOn;
|
DENABLE: IF cRestore IN dial^.flags THEN
RestoreArea (PrivateWS, dial^.front);
FreeArea (dial^.front);
EXCL (dial^.flags, cRestore);
ELSE
ObjcDraw (tr, 0, 8, screen);
END;
|
ELSE
END;
END;
MouseOn;
END DialForm;
(*----------------------------------------------------------------------*
* Dialoghandling *
*----------------------------------------------------------------------*)
PROCEDURE moveDial (t: tObjcTree; x, y: sINTEGER);
(* Bewegt den Dialog *)
CONST fly = 2;
VAR d, i, xx, yy, e, lt, wm: sINTEGER;
(*$Reg*) f: sINTEGER;
(*$Reg*) ox: sINTEGER;
(*$Reg*) oy: sINTEGER;
butt: sBITSET;
blit, moved, b: BOOLEAN;
clp, r: tRect;
dial: DIALOG;
bs: BITSET;
PROCEDURE Redraw (blitten: BOOLEAN);
BEGIN
IF blitten THEN
CopyArea (PrivateWS, area, clp.x, clp.y);
ELSE
ObjcDraw (t, 0, 8, screen);
END;
END Redraw;
BEGIN
dial:= GetDIALOG (t);
StoreMouse;
moved:= FALSE;
IF cMove IN dial^.flags THEN
f:= ObjcFrame (dial^.tree, 0); IF f < 0 THEN f:= ABS (f) ELSE f:= 0; END;
CalcArea (dial^.tree, 0, clp);
blit:= SaveArea (PrivateWS, area, clp);
ox:= x; oy:= y;
GrafMkstate (xx, yy, butt, bs);
MouseHand;
IF NOT (UseSolid IN Config) THEN
MagicAES.GrafDragbox (clp, bound, xx, yy);
moved:= (clp.x # xx) OR (clp.y # yy);
IF moved THEN
RestoreArea (PrivateWS, dial^.back);
dial^.tree^[0].obX:= xx + f;
dial^.tree^[0].obY:= yy + f;
CalcArea (dial^.tree, 0, clp);
b:= SaveArea (PrivateWS, dial^.back, clp);
Redraw (blit);
END;
ELSE
LOOP
GrafMkstate (x, y, butt, bs);
IF NOT (MLinks IN butt) THEN EXIT; END;
IF (y # oy) OR (x # ox) THEN
MoveArea (PrivateWS, dial^.back, x - ox, y - oy, xx, yy);
dial^.tree^[0].obX:= xx + f;
dial^.tree^[0].obY:= yy + f;
ox:= x; oy:= y;
CalcArea (dial^.tree, 0, clp);
Redraw (blit);
END; (* IF *)
END; (* LOOP *)
END; (* IF UseSolid *)
END; (* IF cMove *)
RestoreMouse;
FreeArea (area);
END moveDial;
PROCEDURE hideDial (t: tObjcTree);
(* Macht Dialog durchsichtig *)
VAR xx, yy, i: sINTEGER;
butt: sBITSET;
blit, b: BOOLEAN;
clp: tRect;
dial: DIALOG;
bs: BITSET;
BEGIN
dial:= GetDIALOG (t);
StoreMouse;
IF cMove IN dial^.flags THEN
CalcArea (dial^.tree, 0, clp);
blit:= SaveArea (PrivateWS, area, clp);
RestoreArea (PrivateWS, dial^.back);
MouseOff;
i:= MagicVDI.SetWritemode (PrivateWS, MagicVDI.TRANSPARENT);
IF MaxColors > 2 THEN
i:= 05555H; MagicVDI.SetUserlinestyle (PrivateWS, i); (* Pntjes! *)
i:= MagicVDI.SetLinetype (PrivateWS, MagicVDI.User);
END;
Frame (clp.x + 1, clp.y + 1, clp.w - 3, clp.h - 3, 1);
i:= MagicVDI.SetLinetype (PrivateWS, MagicVDI.Line);
i:= MagicVDI.SetWritemode (PrivateWS, MagicVDI.REPLACE);
MouseBusy;
REPEAT GrafMkstate (xx, yy, butt, bs); UNTIL (butt = {});
IF blit THEN RestoreArea (PrivateWS, area);
ELSE ObjcDraw (dial^.tree, 0, 8, screen);
END;
RestoreMouse;
END;
END hideDial;
(*----------------------------------------------------------------------*
* Eventroutine zum Abfragen der Tasten und Mausknpfe *
*----------------------------------------------------------------------*)
PROCEDURE DoEvent (VAR x, y: sINTEGER;
VAR button: sBITSET;
VAR taste: sINTEGER;
VAR kbshift: sBITSET;
VAR scan: sINTEGER;
VAR ascii: CHAR;
VAR clicks: sINTEGER;
tree: ADDRESS): sBITSET;
VAR event: sBITSET;
i: sINTEGER;
split: RECORD
CASE: BOOLEAN OF
TRUE: wert: sINTEGER;|
FALSE: hi: CHAR;
lo: CHAR;|
END;
END;
d: DIALOG;
BEGIN
(* Array's laden *)
event:= {MUKEYBD, MUBUTTON};
d:= GetDIALOG (tree);
IF d # NIL THEN
CASE d^.pmode OF
CallByTimer: INCL (event, MUTIMER);
AESIntIn[14]:= d^.ptime; AESIntIn[15]:= 0;
|
CallByRect: INCL (event, MUM1);
AESIntIn[4]:= d^.prmod;
AESIntIn[5]:= d^.prect.x;
AESIntIn[6]:= d^.prect.y;
AESIntIn[7]:= d^.prect.w;
AESIntIn[8]:= d^.prect.h;
|
CallByMessage: INCL (event, MUMESAG);
MagicAES.AESAddrIn[0]:= ADR (d^.pmess);
|
ELSE ;
END;
END;
AESIntIn[ 0]:= CastToInt (event);
AESIntIn[ 1]:= 258; (* Nicht ganz legal... *)
AESIntIn[ 2]:= 3;
AESIntIn[ 3]:= 0;
i:= AESCall(25, 16, 7, 1, 0);
event:= CastToBitset (i);
x:= AESIntOut[1];
y:= AESIntOut[2];
button:= CastToBitset (AESIntOut[3]);
kbshift:= CastToBitset (AESIntOut[4]);
split.wert:= AESIntOut[5];
taste:= split.wert;
scan:= CastToInt (split.hi);
ascii:= split.lo;
clicks:= AESIntOut[6];
RETURN event;
END DoEvent;
(*----------------------------------------------------------------------*
* Neue Objekt-Edit Funktionen *
* *
* Idee und Ausfhrung: Dirk Steins *
* *
* Umgeschrieben und auf Lauffhigkeit mit anderen Compilern angepasst *
* (SPC und LPR kennen kein SET OF CHAR): Peter Hellinger *
*----------------------------------------------------------------------*)
TYPE PtrMaxStr = POINTER TO ARRAY [0..255] OF CHAR;
(* Einige Variable wurden global deklariert, damit sie nicht in jeder
* Subprozedur zu ObjcEdit neu ermittelt werden mssen. Das spart Zeit
* und Code. Die Variablen werden bei jedem ObjcEdit-Aufruf neu gesetzt,
* um immer dem aktuellen Objekt zu entsprechen.
*)
VAR spec: MagicAES.PtrTEDINFO; (* Zeiger auf die TeD-Struktur *)
storestr: ARRAY [0..255] OF CHAR;
ptmplt: PtrMaxStr;
ptext: PtrMaxStr;
pvalid: PtrMaxStr; (* die Strings im TeD-Objekt *)
rect: tRect; (* Umgebungsrechteck des Objekts *)
wbox: sINTEGER; (* Fontgre *)
hbox: sINTEGER;
viewlen: sINTEGER;
leftOffs: sINTEGER;
PROCEDURE isalnum (ch: CHAR): BOOLEAN;
BEGIN
RETURN ((ch > '/') AND (ch < ':')) OR
((CAP (ch) > '@') AND (CAP (ch) < '['));
END isalnum;
PROCEDURE valid (idx: sINTEGER; VAR edchar: CHAR): BOOLEAN;
VAR len: sINTEGER;
PROCEDURE isspace (ch: CHAR): BOOLEAN;
BEGIN RETURN (ch > 10C) OR (ch < 14C) OR (ch = ' '); END isspace;
PROCEDURE isdigit (ch: CHAR): BOOLEAN;
(* Extension: Bei Zahleingaben ist auch + und - erlaubt *)
BEGIN
RETURN ((ch > '/') AND (ch < ':')) OR ((ch = '+') OR (ch = '-'));
END isdigit;
PROCEDURE isalpha (ch: CHAR): BOOLEAN;
BEGIN RETURN (CAP (ch) > '@') AND (CAP (ch) < '['); END isalpha;
PROCEDURE isextchr (ch: CHAR; REF extchr: ARRAY OF CHAR): BOOLEAN;
VAR i: sCARDINAL;
BEGIN
FOR i:= 0 TO HIGH (extchr) DO
IF extchr[i] = ch THEN RETURN TRUE; END;
END;
RETURN FALSE;
END isextchr;
BEGIN
len:= Length (pvalid^); (* sINTEGER und sCARDINAL sind Zuweisungskomaptibel! *)
IF idx > len - 1 THEN idx:= len - 1; END;
CASE pvalid^[idx] OF
'X': RETURN TRUE;
|
'x': edchar:= Cap (edchar); RETURN TRUE;
|
'9': RETURN isdigit (edchar);
|
'A',
'N': IF isalpha (edchar) OR (edchar = ' ') OR
((ORD (edchar) >= 194) AND (ORD (edchar) <= 220)) OR
(isextchr (edchar, '¥µ¶·¸á')) THEN
edchar:= Cap (edchar);
RETURN TRUE;
END;
|
'P',
'p',
'F': IF isalnum (edchar) OR (ORD(edchar)> 128) OR
isextchr (edchar, '\?*:._') THEN
edchar:= Cap (edchar); RETURN TRUE;
END;
|
'f': IF isalnum (edchar) OR (ORD(edchar) > 128) OR (edchar = '_') THEN
edchar:= Cap (edchar); RETURN TRUE
END;
|
'a',
'n': IF isalpha (edchar) OR isspace (edchar) OR (ORD (edchar) > 128) THEN
RETURN TRUE
END;
|
ELSE
END;
RETURN FALSE;
END valid;
PROCEDURE GetCursor (idx: sINTEGER; VAR newidx: sINTEGER;
index: BOOLEAN): sINTEGER;
(* Liefert Cursor oder Indexposition *)
VAR (*$Reg*) cpos: sINTEGER;
(*$Reg*) i: sINTEGER;
(*$Reg*) j: sINTEGER;
BEGIN
i:= 0; cpos:= 0;
(* IF ptext^[0] = '@' THEN ptext^[0]:= 0c; END; *)
(* Ende der Maske suchen *)
WHILE (ptmplt^[cpos] # '_') AND (ptmplt^[cpos] # 0c) DO INC (cpos); END;
(* Position bestimmen *)
IF index THEN j:= cpos; ELSE j:= i; END;
WHILE (j < idx) AND (ptmplt^[cpos] # 0c) AND (ptext^[i] # 0c) DO
INC (cpos);
IF (pvalid^[i+1] # 0c) THEN
WHILE (ptmplt^[cpos] # '_') AND (ptmplt^[cpos] # 0c) DO INC (cpos) END;
END;
INC(i);
IF index THEN j:= cpos; ELSE j:= i; END;
END;
IF index THEN RETURN i; END;
IF (i < idx) THEN newidx:= i END;
RETURN cpos
END GetCursor;
CONST SMALL = 5;
TELEFT = 0;
TERIGHT = 1;
TECENTER = 2;
VAR oldPos: sINTEGER;
insMode: BOOLEAN;
PROCEDURE JustPos (): sINTEGER;
VAR cx: sINTEGER;
BEGIN
IF spec^.teJust = TERIGHT THEN
RETURN rect.x + rect.w; (* - (wbox * (spec^.teTmplen-1))); *)
(* RETURN rect.x + (rect.w - (wbox * (spec^.teTmplen-1))); *)
ELSIF spec^.teJust = TECENTER THEN
RETURN rect.x + (rect.w - (wbox * (spec^.teTmplen-1))) DIV 2;
ELSE
RETURN rect.x;
END;
END JustPos;
PROCEDURE drawCursor (cpos: sINTEGER);
VAR i, cx, cy: sINTEGER;
xadd : sINTEGER;
BEGIN
cy:= rect.y; INC (cy, (rect.h - hbox) DIV 2); cx:= JustPos ();
i:= SetWritemode (PrivateWS, XOR);
MouseOff();
IF spec^.teJust = TERIGHT THEN
xadd := - (wbox * (INTEGER(LENGTH(ptext^)) - cpos));
ELSE
xadd := wbox * cpos;
END;
DEC (xadd, leftOffs * wbox);
IF insMode THEN (* Cursor ist ein Strich *)
Line (cx + xadd, cy - 1, 0, hbox + 1);
ELSE (* berschreibmodus, Cursor ist ein Block *)
Rect (cx + xadd, cy - 1, wbox - 1, hbox + 1, MagicAES.BLACK);
END;
MouseOn();
i:= SetWritemode (PrivateWS, REPLACE);
END drawCursor;
TYPE NormKey = (CurRight, CurLeft, CurUp, CurDown,
ShCurLeft, ShCurRight, ShCurUp, ShCurDown,
CtrlCurRight, CtrlCurLeft, CtrlCurUp, CtrlCurDown,
Ins, ShiftIns, ShHome, CtrlHome, CtrlC, CtrlX, CtrlV, Home, BackSpace,
Del, Escape, null, noKey);
PROCEDURE normkey (kstate: sBITSET; VAR ch: sINTEGER): NormKey;
VAR scan, ascii: CHAR;
nk: NormKey;
BEGIN
at.lint:= ch; scan:= CastToChar (at.b2); ascii:= CastToChar (at.b1);
nk:= noKey;
IF (KRSHIFT IN kstate) OR (KLSHIFT IN kstate) THEN (* Shift *)
CASE ORD(scan) OF
54, 77: nk:= ShCurRight;|
42, 75: nk:= ShCurLeft;|
72: nk:= ShCurUp;|
80: nk:= ShCurDown;|
82: nk:= ShiftIns;|
71: nk:= ShHome;
ELSE
END;
ELSIF (KCTRL IN kstate) THEN (* Control *)
CASE ORD(scan) OF
54, 77, 116: nk:= CtrlCurRight;|
42, 75, 115: nk:= CtrlCurLeft;|
72: nk:= CtrlCurUp;|
80: nk:= CtrlCurDown;|
71: nk:= CtrlHome; |
45: nk:= CtrlX; |
46: nk:= CtrlC; |
47: nk:= CtrlV; |
ELSE
END;
ELSIF (KALT IN kstate) THEN (* Alt *)
ELSE (* nichts *)
CASE ORD(scan) OF
1: nk:= Escape;|
14: nk:= BackSpace;|
71: nk:= Home;|
72: nk:= CurUp;|
75: nk:= CurLeft;|
77: nk:= CurRight;|
80: nk:= CurDown;|
82: nk:= Ins;|
83: nk:= Del;|
ELSE
END;
END;
RETURN nk
END normkey;
PROCEDURE MemCopy (to, from: ADDRESS; l: sINTEGER);
VAR f, t: POINTER TO LOC;
i: sINTEGER;
BEGIN
f:= from; t:= to;
IF CastToAddr (t) > CastToAddr (f) THEN
INC(t,l-1); INC(f,l-1);
FOR i:= l-1 TO 0 BY -1 DO t^:= f^ ; DEC(t); DEC (f); END;
ELSE
FOR i:= 0 TO l-1 DO t^:= f^; INC (t); INC(f); END;
END;
END MemCopy;
PROCEDURE MemFill (to: ADDRESS; v: sINTEGER; l: sINTEGER);
VAR t: POINTER TO Byte;
val: Byte;
i: sINTEGER;
BEGIN
t:= to; val:= CastToByte (v);
FOR i:= 0 TO l - 1 DO t^:= val; INC(t); END;
END MemFill;
PROCEDURE doAsciiTab (careForRect: BOOLEAN; VAR ch : CHAR): BOOLEAN;
(* Dialoghandling fr Char-Insert *)
VAR work: tRect;
res : BOOLEAN;
i, voidI, mx, my, wx, wy: sINTEGER;
BEGIN
DialCenter (asciitab, CSCREEN, 0, 0, dummy);
IF careForRect
THEN
(* Aufpassen, daá er Eingabefeld nicht berdeckt! *)
ObjcArea (asciitab, 0, work);
(* ber Eingabefeld plazieren *)
work.y:= rect.y - work.h - CharHeight * 2;
IF work.y < screen.y THEN
(* unter Eingabefeld plazieren *)
work.y:= rect.y + rect.h + CharHeight * 2;
IF work.y + work.h > screen.y + screen.h THEN
DialCenter (asciitab, CSCREEN, 0, 0, dummy);
END;
END;
SetObjcRect (asciitab, 0, work);
END;
DialForm (asciitab, DSTART, dummy, dummy);
DialDraw (asciitab, 0, 8, clip, FALSE);
res := FALSE;
LOOP (* ergnzt durch Hp *)
event:= DoEvent (mx, my, button, taste, kbshift, scan, ascii, clicks, NIL);
IF (MUBUTTON IN event) THEN
voidI:= ObjcFind (asciitab, 0, MAX(sINTEGER), mx, my);
IF (voidI = 1) THEN (* Dialog bewegen *)
moveDial (asciitab, mx, my);
ELSIF (voidI < 0) AND (MLinks IN button) THEN (* Ausserhalb, weg damit *)
Bounce; (* Maustaste entprellen *)
EXIT; (* Nix gewhlt, fertisch... *)
ELSIF (MLinks IN button) THEN (* Buchstaben suchen *)
Bounce; (* Maustaste entprellen *)
ObjcPos (asciitab, voidI, wx, wy);
i:= ((mx - wx) DIV ChWidth); (* Position des Zeichens *)
IF i < 0 THEN i:= 0; END;
IF asciitab^[voidI].obType = GSTRING THEN
ch:= asciitab^[voidI].obSpec.StringPtr^[i];
IF ch # ' ' THEN res := TRUE; EXIT; END;
END;
END;
END;
IF (MUKEYBD IN event) AND (scan = 97) THEN EXIT; END; (* UNDO *)
END; (* Loop *)
DialForm (asciitab, DFINISH, dummy, dummy);
RETURN res;
END doAsciiTab;
PROCEDURE editObject (tree: tObjcTree; obj: sINTEGER; kstate: sBITSET; edchar: sINTEGER;
VAR idx: sINTEGER; kind: sINTEGER; mode: BOOLEAN; nextObj: sINTEGER);
VAR err, i, i2, j, cpos, new, extyp, mx, my, wx, wy, ob, voidI, len, l: sINTEGER;
c: sCARDINAL;
mb: sBITSET;
knorm: NormKey;
adr: ADDRESS;
tmpltFound, move: BOOLEAN;
edCh: ARRAY [0..0] OF CHAR;
draw: BOOLEAN;
isExt: BOOLEAN;
PROCEDURE InsertNormalChar;
BEGIN
c:= 0FFH; BitOp (and, edchar, c, edchar); edCh[0]:= CastToChar (edchar);
cpos:= GetCursor (idx, idx, FALSE); tmpltFound:= FALSE;
IF (edCh[0] # '_') AND (edCh[0] # 0c) THEN
(* Suche nach Template-Zeichen ab cPos in M2 *)
j:= cpos;
LOOP
j:= Pos (edCh, ptmplt^, j, FALSE); len:= Length (ptmplt^);
IF j < len THEN
IF (ptmplt^[j+1] = '_') AND (ptmplt^[j-1] = '_') THEN
tmpltFound:= TRUE; EXIT (* Template gefunden *)
END;
INC (j);
ELSE
EXIT
END;
END; (* LOOP *)
END; (* IF CastToChar (edchar) # '_' ... *)
IF tmpltFound THEN
ptext^[idx]:= 0c; (* String terminieren *)
WHILE cpos # j DO
IF ptmplt^[cpos] = '_' THEN
(* Leerzeichen einfgen *)
editObject (tree, obj, {}, 32, idx, kind, TRUE, nextObj);
END;
INC (cpos);
END; (* WHILE *)
draw := TRUE;
(*
ObjcDraw (tree, obj, 0, screen);
*)
ELSE (* Kein Template-Zeichen eingegeben *)
IF (edCh[0] # 0c) AND (mode OR valid (idx, edCh[0])) THEN
len:= Length (pvalid^);
IF idx < len THEN
IF insMode THEN
adr:= ADR (ptext^[idx]);
l:= Length (ptext^); (* l:= Length (pvalid^); *)
IF l < len THEN MemCopy (adr + LONG (1), adr, l - idx + 1);
ELSE MemCopy (adr + LONG (1), adr, l - idx - 1);
END;
ELSE (* Auf String-Terminierung achten *)
IF (ptext^[idx] = 0c) THEN ptext^[idx+1]:= 0c END;
END;
ptext^[idx]:= edCh[0];
ELSE
ptext^[idx-1]:= edCh[0];
END; (* IF idx < ... *)
(*
IF idx < Min (Length (ptext^), Length (pvalid^)) THEN INC(idx); END;
*)
IF idx < spec^.teTxtlen THEN INC(idx); END;
IF NOT mode THEN
draw := TRUE;
(*
ObjcDraw (tree, obj, 0, screen);
*)
END;
END; (* IF edCH # 0c .... *)
END; (* IF tmpltFound (p # NIL..) *)
END InsertNormalChar;
PROCEDURE CharInsert;
(* Dialoghandling fr Char-Insert *)
VAR work: tRect;
ch : CHAR;
res : BOOLEAN;
BEGIN
IF pvalid^[idx] = 'X' THEN
MagicAES.WindUpdate (BEGMCTRL);
res := doAsciiTab (TRUE, ch);
MagicAES.WindUpdate (ENDMCTRL);
IF res
THEN
edchar := ORD (ch);
InsertNormalChar();
END;
END;
END CharInsert;
PROCEDURE EdInit;
BEGIN
leftOffs := 0;
len:= Length(ptext^);
IF (idx < 0) OR (idx > len) THEN idx:= len; END;
IF isExt
THEN
leftOffs := spec^.teFontid;
(*
spec^.teFontid := 0;
*)
IF idx > leftOffs+viewlen
THEN
idx := leftOffs
ELSIF idx < leftOffs
THEN
leftOffs := Max (idx - viewlen, 0);
END;
IF len < viewlen
THEN
leftOffs := 0;
END;
spec^.teFontid := leftOffs;
END;
cpos:= GetCursor (idx, idx, FALSE);
IF NOT mode THEN drawCursor (cpos); END;
oldPos:= cpos;
END EdInit;
PROCEDURE getScrap (VAR scrap: ARRAY OF CHAR): BOOLEAN;
CONST scrapName = 'SCRAP.TXT';
VAR b : BITSET;
BEGIN
b := MagicAES.ScrpRead(scrap);
IF b = {} THEN RETURN FALSE END;
IF scrap[0] = 0C THEN RETURN FALSE END;
IF scrap[Length(scrap)-1] # '\'
THEN
Append('\', scrap);
END;
Append (scrapName, scrap);
RETURN TRUE
END getScrap;
PROCEDURE writeToClip (REF str : ARRAY OF CHAR): BOOLEAN;
VAR name : ARRAY [0..255] OF CHAR;
hdl : sINTEGER;
cnt : LONGCARD;
BEGIN
IF ~getScrap (name) THEN RETURN FALSE END;
hdl := MagicDOS.Fcreate (name, {});
IF hdl < 0 THEN RETURN FALSE END;
cnt := LENGTH (str);
MagicDOS.Fwrite (hdl, cnt, CADR(str));
hdl := MagicDOS.Fclose (hdl);
RETURN TRUE;
END writeToClip;
PROCEDURE readFromClip ();
CONST CR = 15C;
LF = 12C;
VAR name : ARRAY [0..255] OF CHAR;
hdl : sINTEGER;
cnt : LONGCARD;
char : CHAR;
BEGIN
IF ~getScrap (name) THEN RETURN END;
hdl := MagicDOS.Fopen (name, MagicDOS.Read);
IF hdl < 0 THEN RETURN END;
cnt := 1;
REPEAT
MagicDOS.Fread (hdl, cnt, ADR(char));
IF (cnt = 1) & (char # CR) & (char # LF)
THEN
editObject (tree, obj, {}, ORD (char), idx, kind, TRUE, nextObj);
END;
UNTIL (cnt # 1);
hdl := MagicDOS.Fclose (hdl);
END readFromClip;
PROCEDURE EdChar;
BEGIN
draw := FALSE;
knorm:= normkey (kstate, edchar);
IF (oldPos # -1) AND NOT mode THEN (* alten Cursor lschen *)
drawCursor (oldPos);
END;
CASE knorm OF
CtrlX,
CtrlC: IF writeToClip (ptext^) &
(knorm = CtrlX)
THEN
(* Editfeld lschen *)
knorm := Escape;
END; |
CtrlV: readFromClip ();
draw := TRUE; |
ELSE
END;
CASE knorm OF
ShHome: Assign (ptext^, storestr);
|
Home: Assign (storestr, ptext^);
idx:= 0;
draw := TRUE;
(*
ObjcDraw (tree, obj, 0, screen);
*)
|
CurLeft: IF idx > 0 THEN DEC (idx); END;
|
ShCurLeft: idx:= 0;
|
CurRight: IF idx < Min (Length (ptext^), Length (pvalid^)) THEN INC(idx); END;
|
ShCurRight: idx:= Min (Length(ptext^), Length (pvalid^));
|
Ins: insMode:= NOT insMode;
|
ShiftIns: CharInsert;
|
null: i2:= idx; i:= -1; cpos:= 0;
REPEAT
INC (i);
WHILE (ptmplt^[cpos] # '_') AND
(ptmplt^[cpos] # 0c) DO INC (cpos) END;
INC (cpos);
UNTIL NOT ((i2 > cpos-1) AND (ptmplt^[cpos] # 0c) AND
(ptext^[i] # 0c) (* AND (ptext^[i] # '@') *) );
idx:= i;
|
Del: IF ptext^[idx] # 0c THEN
adr:= ADR (ptext^[idx]); len:= Length (ptext^);
MemCopy (adr, adr + LONG(1), len - idx);
(*
ObjcDraw (tree, obj, 0, screen);
*)
draw := TRUE;
END;
|
BackSpace: IF (idx > 0) AND (ptext^[idx-1] # 0c) THEN
adr:= CastToAddr(ptext) + CastToAddr (idx);
len:= Length (ptext^);
MemCopy (adr - LONG(1), adr, len - idx + 1);
DEC (idx);
(*
ObjcDraw (tree, obj, 0, screen);
*)
draw := TRUE
END;
|
Escape: MemFill (ptext, 0, Length (pvalid^));
idx:= 0;
draw := TRUE;
(*
ObjcDraw (tree, obj, 0, screen);
*)
|
CtrlCurRight: WHILE (ptext^[idx] # 0c) AND (isalnum (ptext^[idx]) OR
(ORD(ptext^[idx]) > 127)) DO INC(idx); END;
WHILE (ptext^[idx] # 0c) AND NOT ((isalnum (ptext^[idx]) OR
(ORD(ptext^[idx]) > 127))) DO INC(idx); END;
|
CtrlCurLeft: WHILE (idx > 0) AND NOT ((isalnum (ptext^[idx-1]) OR
(ORD(ptext^[idx-1]) > 127))) DO DEC(idx); END;
WHILE (idx > 0) AND (isalnum (ptext^[idx-1]) OR
(ORD(ptext^[idx-1]) > 127)) DO DEC(idx); END;
|
CtrlX,
CtrlC,
CtrlV: |
ELSE InsertNormalChar();
END (* CASE normkey *);
cpos:= GetCursor (idx, idx, FALSE);
IF isExt
THEN
IF idx <= leftOffs
THEN
leftOffs := Max (0, idx-1);
draw := TRUE;
ELSIF idx >= leftOffs + viewlen
THEN
leftOffs := idx - viewlen;
draw := TRUE;
END;
spec^.teFontid := leftOffs;
END;
IF draw & ~mode THEN
ObjcDraw (tree, obj, 0, screen);
END;
IF NOT mode THEN drawCursor (cpos) END;
oldPos:= cpos;
END EdChar;
BEGIN
GetObjcExtype (tree, obj, extyp, ob);
isExt := extyp = LongEdit;
IF (EDITABLE IN tree^[obj].obFlags) AND
((ob = GFTEXT) OR (ob = GFBOXTEXT)) THEN
IF kind = EDINIT THEN
EdInit;
ELSIF kind = EDCHAR THEN
EdChar;
ELSIF kind = EDEND THEN
IF (oldPos # -1) AND NOT mode THEN drawCursor (oldPos); END;
IF isExt
THEN
leftOffs := 0;
(* spec^.teFontid := 0;
ObjcDraw (tree, obj, 0, screen);
*)
END;
oldPos:= -1;
END; (* IF *)
END; (* IF EDITABLE *)
END editObject;
PROCEDURE UpdateEdobj (tree: ADDRESS; object: sINTEGER);
VAR t: tObjcTree;
BEGIN
t:= tree; spec:= mtXobjects.GetObSpec (t, object);
IF spec^.teFont = SMALL THEN wbox:= 6; hbox:= 6;
ELSE wbox:= ChWidth; hbox:= CharHeight;
END;
ptmplt:= CastToAddr (spec^.tePtmplt);
ptext:= CastToAddr (spec^.tePtext);
pvalid:= CastToAddr (spec^.tePvalid);
ObjcArea (tree, object, rect);
viewlen := t^[object].obWidth DIV ChWidth;
IF cCoords IN t^[object].obFlags
THEN
DEC (viewlen);
DEC (rect.w, ChWidth);
END;
END UpdateEdobj;
PROCEDURE ObjcEdit (tree: ADDRESS; object: sINTEGER; VAR pos: sINTEGER;
char, kind: sINTEGER);
(* Zustzlich bentigt wird:
* kstate: Tastaturstatus (steht in glob. Var)
* mode : Irgendwas mit Cursorzeichnen oder nicht
* next_obj: Index des nchsten zu editierenden Objektes
*)
VAR res: sINTEGER;
nextObj: sINTEGER;
txtLen, tmpltLen : sINTEGER;
BEGIN
IF ~IsMagiCScroll THEN
UpdateEdobj (tree, object);
editObject (tree, object, kbshift, char, pos, kind, FALSE, nextObj);
ELSE
(* Workaround fr WindowDials *)
IF (pos < 0) THEN pos:= lastPos; END;
MagicAES.ObjcEdit (tree, object, pos, char, kind);
lastPos := pos;
END;
END ObjcEdit;
(*
PROCEDURE DoConfig (tree: ADDRESS; mx, my: sINTEGER);
(* Die Werte hier sind abhngig von den Eintrgen in confdial! *)
VAR i, j: sINTEGER;
PROCEDURE SwitchKey (von, nach: sBITSET);
VAR j: sINTEGER;
d: DIALOG;
BEGIN
d:= GetDIALOG (tree);
FOR j:= 0 TO MaxKeys DO
WITH d^.keys[j] DO
IF scan = -1 THEN RETURN; END;
IF kbstate = von THEN kbstate:= nach; END;
END;
END;
END SwitchKey;
PROCEDURE SwitchConfig (flag: CARDINAL);
BEGIN
IF flag IN Config THEN EXCL (Config, flag) ELSE INCL (Config, flag) END;
END SwitchConfig;
BEGIN
IF UseConfig IN Config THEN
SetState (confdial, 1, CHECKED, UseALT IN Config);
SetState (confdial, 2, CHECKED, NOT (UseALT IN Config));
SetState (confdial, 3, CHECKED, UseSolid IN Config);
SetState (confdial, 4, CHECKED, UseEdit IN Config);
SetState (confdial, 5, CHECKED, UseCenter IN Config);
SetState (confdial, 6, CHECKED, UseMouse IN Config);
SetState (confdial, 7, CHECKED, UsePos IN Config);
SetState (confdial, 8, CHECKED, UseGrowbox IN Config);
i:= TreePopup (confdial, mx - (10 * ChWidth), my, 2);
CASE i OF
1: INCL (Config, UseALT); ShortKey:= {KALT}; SwitchKey ({KCTRL}, {KALT});|
2: EXCL (Config, UseALT); ShortKey:= {KCTRL}; SwitchKey ({KALT}, {KCTRL});|
3: SwitchConfig (UseSolid);|
4: SwitchConfig (UseEdit);|
5: SwitchConfig (UseCenter);
IF UseCenter IN Config THEN Config:= Config - {UseMouse, UsePos}; END;|
6: SwitchConfig (UseMouse);
IF UseMouse IN Config THEN Config:= Config - {UseCenter, UsePos}; END;|
7: SwitchConfig (UsePos);
IF UsePos IN Config THEN Config:= Config - {UseCenter, UseMouse}; END;|
8: SwitchConfig (UseGrowbox);|
ELSE (* Nix *);
END;
END;
END DoConfig;
*)
(*----------------------------------------------------------------------*
* Das "etwas andere" form_do *
*----------------------------------------------------------------------*)
CONST NoObject = 32765;
PROCEDURE Scankey (tree: ADDRESS; scan: sINTEGER; kbshift: sBITSET;
VAR ob: sINTEGER; VAR act: BOOLEAN);
(* Nach Shortcut und Userkey scannen *)
VAR (*$Reg*) i: sINTEGER;
d: DIALOG;
BEGIN
d:= GetDIALOG (tree); i:= 0; ob:= NoObject; act:= FALSE;
CASE scan OF
103, 104, 105: scan:= scan - 95;|
106, 107, 108: scan:= scan - 101;|
109, 110, 111: scan:= scan - 107;|
112: scan:= 11; (* 0 *)|
120..132: scan:= scan - 118;|
ELSE ;
END;
(* Bei Shift-Tasten nicht unterscheiden *)
IF (Bit0 IN kbshift) OR (Bit1 IN kbshift) THEN
kbshift:= kbshift + {Bit0, Bit1};
END;
WITH d^ DO
LOOP
IF (keys[i].scan = -1) THEN EXIT; END; (* End of List *)
(* Testen, ob dieses Objekt gemeint war *)
IF (keys[i].scan = scan) AND (keys[i].kbstate = kbshift) THEN
(* Knnte es sein *)
IF (keys[i].object < 0) OR
(~InState (tree, keys[i].object, DISABLED)
& ~InFlag (tree, keys[i].object, HIDETREE))
THEN
ob:= keys[i].object; act:= keys[i].action;
EXIT;
END;
END;
INC (i);
END; (* LOOP *)
END; (* WITH *)
END Scankey;
(*-------------------------------------------------------------------------*)
(*- -*)
(*- Event abarbeiten -> TRUE: Objekt erwischt -*)
(*- -*)
(*-------------------------------------------------------------------------*)
PROCEDURE HandleEvent (event : sBITSET;
VAR x, y: sINTEGER;
VAR button: sBITSET;
VAR taste: sINTEGER;
VAR kstate: sBITSET;
VAR scan: sINTEGER;
VAR ascii: CHAR;
VAR clicks: sINTEGER;
tree: ADDRESS;
editable : BOOLEAN;
VAR edit : sINTEGER;
VAR pos : sINTEGER;
VAR entry : sINTEGER
): BOOLEAN;
VAR dial : DIALOG;
kret, key, nxt, i, typ, cx, cy, ex : sINTEGER;
user : sBITSET;
action : BOOLEAN;
PROCEDURE ChangeEdit (eintrag: sINTEGER);
BEGIN
IF editable THEN
ObjcEdit (tree, edit, pos, 0, EDEND);
IF eintrag # edit THEN edit:= eintrag; insMode:= TRUE; END;
ObjcEdit (tree, edit, pos, 0, EDINIT);
END;
END ChangeEdit;
BEGIN
nxt := edit;
kbshift := kstate;
dial:= GetDIALOG (tree);
IF dial = NIL THEN
(* RETURN FALSE;*)
HALT; (* darf eigentlich nicht passieren *)
ELSE
WITH dial^ DO
(* Userhandler aufrufen *)
IF (cUser IN flags) THEN
IF (pmode = CallByEvent) OR
((pmode = CallByTimer) AND (MUTIMER IN event)) OR
((pmode = CallByRect) AND (MUM1 IN event)) OR
((pmode = CallByMessage) AND (MUMESAG IN event)) THEN
user:= proc (tree, mX, mY, scan, kbshift, event, edit);
IF user # {} THEN entry:= -1; RETURN TRUE; END;
END;
END; (* IF cUser *)
(*--- Objekt mit Maustaste gewhlt? ---*)
IF (MUBUTTON IN event) THEN
IF (MRechts IN button) (* OR ((MLinks IN button) AND (kbshift # {})) *) THEN
(* Dialog durchsichtig machen *)
IF (MRechts IN button) THEN
entry:= ObjcFind (tree, 0, 8, mX, mY);
IF entry >= 0 THEN GetObjcExtype (tree, entry, ex, typ);
ELSE ex:= -1;
END;
ELSE
ex:= MoveBox
END;
IF ex = MoveBox THEN
IF editable THEN ObjcEdit (tree, edit, pos, 0, EDEND); END;
hideDial (tree); entry:= -1;
IF editable THEN ObjcEdit (tree, edit, pos, 0, EDINIT); END;
END;
ELSIF MLinks IN button THEN
(* Mit gedrckter Maustaste in einen Button fahren zulassen *)
LOOP
MagicAES.GrafMkstate (mX, mY, button, kbshift);
entry:= ObjcFind (tree, 0, MAX(sINTEGER), mX, mY);
IF NOT (MLinks IN button) THEN
(* Corrected by Steffen Engel *)
IF (entry > 0) AND (DISABLED IN tree^[entry].obState) THEN
entry:= 0;
END;
EXIT;
END;
IF entry < 0 THEN
Glocke;
ELSE
GetObjcExtype (tree, entry, ex, typ);
IF NOT (DISABLED IN tree^[entry].obState) THEN
IF ((ex = MoveBox) OR
(SELECTABLE IN tree^[entry].obFlags) OR
(Exit IN tree^[entry].obFlags) OR
(TOUCHEXIT IN tree^[entry].obFlags)) THEN EXIT;
END; (* IF ((ex = MoveBox) *)
END; (* IF NOT *)
END; (* IF entry < 0 *)
END; (* LOOP *)
IF entry < 0 THEN (* Ausserhalb *)
Glocke;
ELSE (* Moveobjekt angeklickt? *)
GetObjcExtype (tree, entry, ex, typ);
IF ex = MoveBox THEN
IF editable THEN ObjcEdit (tree, edit, pos, 0, EDEND); END;
IF clicks > 1 THEN (* DoConfig (tree, mX, mY); *)
ELSE moveDial (tree, mX, mY);
END;
IF editable THEN ObjcEdit (tree, edit, pos, 0, EDINIT); END;
entry:= -1;
ELSE (* Anderes Objekt erwischt *)
IF (EDITABLE IN tree^[entry].obFlags)
(* nur wenn es kein Fensterdialog oder oberstes Fenster ist *)
THEN (* Edit-Cursor plazieren *)
IF IsMagiCScroll
THEN
ChangeEdit (entry);
ELSE
(*
IF UseEdit IN Config
THEN
*)
UpdateEdobj (tree, entry);
cx:= JustPos ();
IF insMode
THEN
pos:= (mX - cx + wbox DIV 2) DIV wbox;
ELSE
pos:= (mX - cx) DIV wbox;
END;
(* Gendert, arbeitete direkt auf dem Baum und rechnete nicht
* mit Userdef-Editable
*)
IF pos > spec^.teTmplen - 1 THEN
pos:= spec^.teTmplen - 1;
END;
pos:= GetCursor (pos, i, TRUE);
END; (* IF UseEdit *)
ChangeEdit (entry);
END;
IF MagicAES.FormButton (tree, entry, clicks, nxt) = 0
THEN
RETURN TRUE;
END;
END; (* IF ex = MoveBox *)
END; (* IF entry >= 0 *)
END; (* IF MRechts *)
END; (* IF MUBUTTON *)
(*--- Objekt mit Tastatur gewhlt ---*)
IF MUKEYBD IN event
THEN
(* Erst Scankey abfragen. Haben Vorrang!!! *)
Scankey (tree, scan, kbshift, entry, action);
IF ~editable & (entry = NoObject)
THEN
(* Buttons in Dialogen ohne Editfelder sind auch mit
* ohne Sondertaste bedienbar
*)
kbshift := kbshift + ShortKey;
Scankey (tree, scan, kbshift, entry, action);
kbshift := kstate;
(* kbshift wieder restaurieren, wird mglicherweise noch
* gebraucht
*)
END;
IF (entry < 0)
THEN
RETURN TRUE;
ELSIF (entry = NoObject)
THEN
(* vielleicht Editeingabe? *)
IF edit < 0 THEN (* Workaround fr Mag!X *)
kret:= FormKeybd (tree, 0, taste, nxt, key);
ELSE
kret:= FormKeybd (tree, edit, taste, nxt, key);
END;
IF kret > 0
THEN
IF nxt > 0
THEN
IF UseEdit IN Config
THEN
pos:= -1;
END;
ChangeEdit (nxt);
IF editable
THEN
entry := edit;
ELSE
entry := -1;
END;
ELSIF key > 0
THEN
IF editable
THEN
ObjcEdit (tree, edit, pos, key, EDCHAR);
entry := edit;
ELSE
entry := -1;
END;
END; (* IF nxt > 0 *)
ELSE
entry := nxt;
RETURN TRUE;
END; (* IF kret > 0 *)
ELSE
IF action
THEN
IF MagicAES.FormButton (tree, entry, 1, nxt) = 0
THEN
RETURN TRUE;
END;
ELSE
RETURN TRUE;
END;
END; (* IF entry < 0 *)
END; (* IF MUBKEYBRD *)
(* Userhandler aufrufen *)
IF (cUser IN flags) AND (pmode = CallByHandling)
THEN
user:= proc (tree, mX, mY, scan, kbshift, event, edit);
IF user # {}
THEN
entry:= -1;
RETURN TRUE;
END;
END;
END; (* WITH dial^ *)
RETURN FALSE; (* nix gefunden *)
END; (* IF Dial # NIL *)
END HandleEvent;
PROCEDURE PrepDial ( tr : ADDRESS;
start : sINTEGER;
VAR editable : BOOLEAN;
VAR pos, edit : sINTEGER);
CONST Undo = 97;
Help = 98;
Enter = 114;
Return = 28;
VAR i : sINTEGER;
t : tObjcTree;
BEGIN
t := tr;
(*
(* Default-Userkeys eintragen *)
i:= ScanFlags (t, SearchFlags, 0, DEFAULT);
IF i >= 0 THEN
SetUserkey (t, i, Enter, {}, TRUE, TRUE); (* Enter *)
SetUserkey (t, i, Return, {}, TRUE, TRUE); (* Return *)
END;
*)
i:= ScanFlags (t, SearchFlags, 0, UndoButton);
IF i >= 0 THEN SetUserkey (t, i, Undo, {}, TRUE, TRUE); END;
i:= ScanFlags (t, SearchFlags, 0, HelpButton);
IF i >= 0 THEN SetUserkey (t, i, Help, {}, TRUE, TRUE); END;
IF start < 0 THEN (* Sicher kein Editfeld *)
edit:= -1; editable:= FALSE;
ELSIF NOT (EDITABLE IN t^[start].obFlags) THEN
(* Startobjekt ist kein Editfeld; Suchen! *)
edit:= ScanFlags (t, SearchFlags, 0, EDITABLE);
editable:= edit >= 0;
ELSE (* bergebenes Feld ist Editfeld *)
edit:= start; editable:= TRUE;
END;
pos := -1;
END PrepDial;
(*altes DialDo:
PROCEDURE DialDo (t: ADDRESS; start: sINTEGER): sINTEGER;
CONST Undo = 97;
Help = 98;
Enter = 114;
Return = 28;
VAR pos, nxt, i, entry, edit, key, kret, old, cx, cy, tmp, default,
ex, typ: sINTEGER;
editable, tmpflag, end, normalkey, action: BOOLEAN;
select, user: sBITSET;
dial: DIALOG;
PROCEDURE ChangeEdit (eintrag: sINTEGER);
BEGIN
IF editable THEN
ObjcEdit (t, edit, pos, 0, EDEND);
IF eintrag # edit THEN edit:= eintrag; insMode:= TRUE; END;
ObjcEdit (t, edit, pos, 0, EDINIT);
END;
END ChangeEdit;
BEGIN
dial:= GetDIALOG (t);
IF dial # NIL THEN
WITH dial^ DO
(*
(* Default-Userkeys eintragen *)
i:= ScanFlags (t, SearchFlags, 0, DEFAULT);
IF i >= 0 THEN
SetUserkey (t, i, Enter, {}, TRUE, TRUE); (* Enter *)
SetUserkey (t, i, Return, {}, TRUE, TRUE); (* Return *)
END;
*) i:= ScanFlags (t, SearchFlags, 0, UndoButton);
IF i >= 0 THEN SetUserkey (t, i, Undo, {}, TRUE, TRUE); END;
i:= ScanFlags (t, SearchFlags, 0, HelpButton);
IF i >= 0 THEN SetUserkey (t, i, Help, {}, TRUE, TRUE); END;
IF UseEdit IN Config THEN pos:= -1; END;
WindUpdate (BEGMCTRL); (* Finger von der Maus, AES! *)
IF start < 0 THEN (* Sicher kein Editfeld *)
edit:= -1; editable:= FALSE;
ELSIF NOT (EDITABLE IN tree^[start].obFlags) THEN
(* Startobjekt ist kein Editfeld; Suchen! *)
edit:= ScanFlags (t, SearchFlags, 0, EDITABLE);
editable:= edit >= 0;
ELSE (* bergebenes Feld ist Editfeld *)
edit:= start; editable:= TRUE;
END;
IF editable THEN ObjcEdit (t, edit, pos, 0, EDINIT); END;
MouseOn;
LOOP (* 1 *)
entry:= -1; nxt:= edit;
event:= DoEvent (mX, mY, button, taste, kbshift, scan, ascii, clicks, t);
(* Userhandler aufrufen *)
IF (cUser IN flags) THEN
IF (pmode = CallByEvent) OR
((pmode = CallByTimer) AND (MUTIMER IN event)) OR
((pmode = CallByRect) AND (MUM1 IN event)) OR
((pmode = CallByMessage) AND (MUMESAG IN event)) THEN
user:= proc (t, mX, mY, scan, kbshift, event, edit);
IF user # {} THEN entry:= -1; EXIT; END;
END;
END; (* IF cUser *)
(*--- Objekt mit Maustaste gewhlt? ---*)
IF (MUBUTTON IN event) THEN
IF (MRechts IN button) (* OR ((MLinks IN button) AND (kbshift # {})) *) THEN
(* Dialog durchsichtig machen *)
(* IF (MRechts IN button) THEN *)
entry:= ObjcFind (t, 0, 8, mX, mY);
IF entry >= 0 THEN GetObjcExtype (t, entry, ex, typ);
ELSE ex:= -1;
END;
(* ELSE
ex:= MoveBox
END; *)
IF ex = MoveBox THEN
IF editable THEN ObjcEdit (t, edit, pos, 0, EDEND); END;
hideDial (t); entry:= -1;
IF editable THEN ObjcEdit (t, edit, pos, 0, EDINIT); END;
END;
ELSIF MLinks IN button THEN
(* Mit gedrckter Maustaste in einen Button fahren zulassen *)
LOOP
MagicAES.GrafMkstate (mX, mY, button, kbshift);
entry:= ObjcFind (t, 0, MAX(INTEGER), mX, mY);
IF NOT (MLinks IN button) THEN
(* Corrected by Steffen Engel *)
IF (entry > 0) AND (DISABLED IN tree^[entry].obState) THEN
entry:= 0;
END;
EXIT;
END;
IF entry < 0 THEN
Glocke;
ELSE
GetObjcExtype (t, entry, ex, typ);
IF NOT (DISABLED IN tree^[entry].obState) THEN
IF (ex = MoveBox) AND (kbshift # {})
THEN
IF editable THEN ObjcEdit (t, edit, pos, 0, EDEND); END;
hideDial (t); entry:= -1;
IF editable THEN ObjcEdit (t, edit, pos, 0, EDINIT); END;
ELSE
IF ((ex = MoveBox) OR
(SELECTABLE IN tree^[entry].obFlags) OR
(Exit IN tree^[entry].obFlags) OR
(TOUCHEXIT IN tree^[entry].obFlags)) THEN EXIT;
END; (* IF ((ex = MoveBox) *)
END;
END; (* IF NOT *)
END; (* IF entry < 0 *)
END; (* LOOP *)
IF entry < 0 THEN (* Ausserhalb *)
Glocke;
ELSE (* Moveobjekt angeklickt? *)
GetObjcExtype (t, entry, ex, typ);
IF ex = MoveBox THEN
IF editable THEN ObjcEdit (t, edit, pos, 0, EDEND); END;
IF clicks > 1 THEN (* DoConfig (t, mX, mY); *)
ELSE moveDial (t, mX, mY);
END;
IF editable THEN ObjcEdit (t, edit, pos, 0, EDINIT); END;
entry:= -1;
ELSE (* Anderes Objekt erwischt *)
IF (EDITABLE IN tree^[entry].obFlags) THEN (* Edit-Cursor plazieren *)
IF UseEdit IN Config THEN
UpdateEdobj (t, entry); cx:= JustPos ();
IF insMode THEN pos:= (mX - cx + wbox DIV 2) DIV wbox;
ELSE pos:= (mX - cx) DIV wbox;
END;
(* Gendert, arbeitete direkt auf dem Baum und rechnete nicht
* mit Userdef-Editable
*)
IF pos > spec^.teTmplen - 1 THEN
pos:= spec^.teTmplen - 1;
END;
pos:= GetCursor (pos, i, TRUE);
END; (* IF UseEdit *)
ChangeEdit (entry);
END;
IF MagicAES.FormButton (t, entry, clicks, nxt) = 0 THEN EXIT END;
END; (* IF ex = MoveBox *)
END; (* IF entry >= 0 *)
END; (* IF MRechts *)
END; (* IF MUBUTTON *)
(*--- Objekt mit Tastatur gewhlt ---*)
IF MUKEYBD IN event THEN
(* Erst Scankey abfragen. Haben Vorrang!!! *)
Scankey (t, scan, kbshift, entry, action);
IF (entry < 0) THEN
EXIT;
ELSIF (entry = NoObject) THEN
(* vielleicht Editeingabe? *)
IF edit < 0 THEN (* Workaround fr Mag!X *)
kret:= FormKeybd (t, 0, taste, nxt, key);
ELSE
kret:= FormKeybd (t, edit, taste, nxt, key);
END;
IF kret > 0 THEN
IF nxt > 0 THEN
IF UseEdit IN Config THEN pos:= -1; END; ChangeEdit (nxt);
ELSIF key > 0 THEN
IF editable THEN ObjcEdit (t, edit, pos, key, EDCHAR); END;
END; (* IF nxt > 0 *)
ELSE
entry := nxt;
EXIT
END; (* IF kret > 0 *)
ELSE
IF action THEN
IF MagicAES.FormButton (t, entry, 1, nxt) = 0 THEN EXIT END;
ELSE
EXIT;
END;
END; (* IF entry < 0 *)
END; (* IF MUBKEYBRD *)
(* Userhandler aufrufen *)
IF (cUser IN flags) AND (pmode = CallByHandling) THEN
user:= proc (tree, mX, mY, scan, kbshift, event, edit);
IF user # {} THEN entry:= -1; EXIT; END;
END;
END; (* LOOP 1 *)
IF editable THEN ObjcEdit (tree, edit, pos, 0, EDEND); END;
IF (MUBUTTON IN event) AND (clicks > 1) THEN
(* Doppelklick: Bit15 im Return-Wert setzen *)
select:= CastToBitset (entry);
INCL (select, Bit15);
entry:= CastToInt (select);
END;
WindUpdate (ENDMCTRL);
RETURN entry;
END;
END;
RETURN -1;
END DialDo;
*)
(* neues DialDo: *)
PROCEDURE InternalDialDo (t: ADDRESS; start: sINTEGER): sINTEGER;
VAR pos, i, entry, edit : sINTEGER;
editable : BOOLEAN;
dial : DIALOG;
select : sBITSET;
BEGIN
dial:= GetDIALOG (t);
IF dial # NIL THEN
WITH dial^ DO
PrepDial(t, start, editable, pos, edit);
IF editable THEN ObjcEdit (t, edit, pos, 0, EDINIT); END;
WindUpdate (BEGMCTRL); (* Finger von der Maus, AES! *)
MouseOn;
LOOP (* 1 *)
entry:= -1;
event:= DoEvent (mX, mY, button, taste, kbshift, scan, ascii, clicks, t);
IF HandleEvent (event, mX, mY, button, taste, kbshift, scan, ascii, clicks,
t, editable, edit, pos, entry)
THEN
EXIT;
END;
END; (* LOOP 1 *)
IF editable THEN ObjcEdit (t, edit, pos, 0, EDEND); END;
IF (MUBUTTON IN event) AND (clicks > 1) THEN
(* Doppelklick: Bit15 im Return-Wert setzen *)
select:= CastToBitset (entry);
INCL (select, Bit15);
entry:= CastToInt (select);
END;
WindUpdate (ENDMCTRL);
RETURN entry;
END;
END;
RETURN -1;
END InternalDialDo;
PROCEDURE DialDo (t: ADDRESS; start: sINTEGER): sINTEGER;
BEGIN
RETURN dialDo (t, start);
END DialDo;
PROCEDURE OverloadDialDo (newDialDo: DialDoProc): DialDoProc;
VAR oldDialDo : DialDoProc;
BEGIN
IF newDialDo = DialDoProc (NIL)
THEN
oldDialDo := InternalDialDo;
dialDo := InternalDialDo;
ELSE
oldDialDo := dialDo;
dialDo := newDialDo;
END;
RETURN oldDialDo;
END OverloadDialDo;
PROCEDURE IsOverloadedDialDo (): BOOLEAN;
BEGIN
RETURN dialDo # InternalDialDo;
END IsOverloadedDialDo;
PROCEDURE DisableMenu(menu: ADDRESS; disable : BOOLEAN);
VAR o, title : sINTEGER;
t : tObjcTree;
n : ADDRESS;
BEGIN
t:= menu;
title:= t^[t^[t^[0].obHead].obHead].obHead; (* Index erster Titel *)
o:= t^[t^[t^[0].obHead].obNext].obHead; (* Index erste Box *)
SetState(t, t^[o].obHead, MagicAES.DISABLED, disable); (* ersten Eintrag *)
LOOP (* 1 *)
IF title > t^[title].obNext THEN EXIT; (* LOOP 1 *) END;
title:= t^[title].obNext;
SetState(t, title, MagicAES.DISABLED, disable); (* titel disablen *)
ExclState(t, title, MagicAES.SELECTED); (* deselektieren *)
END; (* LOOP 1 *)
o := MagicAES.MenuBar(menu, MagicAES.Set);
END DisableMenu;
PROCEDURE DialCharTable (VAR ch: CHAR): BOOLEAN;
(* Ruft einen Standarddialog mit einer Zeichenauswahl auf.
* TRUE: Zeichen wurde ausgewhlt, steht dann in ch
*)
VAR tmpCh: CHAR;
res : BOOLEAN;
BEGIN
WindUpdate (BEGMCTRL);
res := doAsciiTab (FALSE, tmpCh);
WindUpdate (ENDMCTRL);
IF res
THEN
ch := tmpCh;
END;
RETURN res;
END DialCharTable;
(*----------------------------------------------------------------------*
* Initialisierung des Moduls *
*----------------------------------------------------------------------*)
PROCEDURE InitDials;
CONST
(* Cookies definieren *)
MagiXCookie = 'MagX';
Magic = 'MagC';
VAR adr: tObjcTree;
b: BOOLEAN;
magIx: BOOLEAN;
mgxPtr: POINTER TO RECORD
config_status : LONGCARD; (* long config_status; *)
dosvars : ADDRESS; (* DOSVARS *dosvars; *)
aesvars : POINTER TO RECORD (* AESVARS *aesvars; *)
magic : LONGCARD; (* mu $87654321 sein *)
membot : ADDRESS; (* Ende der AES- Variablen *)
aes_start : ADDRESS; (* Startadresse *)
magic2 : LONGCARD; (* ist 'MAGX' *)
date : LONGCARD; (* Erstelldatum *)
(* Die Struktur geht noch weiter,
* interessiert uns hier aber nicht
*)
END;
END;
crdate: LONGCARD;
dist: ARRAY [0..4] OF INTEGER;
effect: ARRAY [0..2] OF INTEGER;
f, i, j, ch, cw: INTEGER;
rsc: RESOURCE;
a: RECORD
CASE : INTEGER OF
0 : lc : lCARDINAL; |
1 : x : RECORD
v : INTEGER;
s : sBITSET;
END;
END;
END;
BEGIN
IF init # 30961 THEN
(*
InqFaceinfo (PrivateWS, i, i, i, dist, effect);
ChSize:= dist[4];*)
ChSize := AESFontsize; ChWidth:= CharWidth; ROffset:= CharWidth * 3;
control7:= ADR (VDIControl[7]);
control9:= ADR (VDIControl[9]);
ScreenMFDB.fdAddr:= 0;
small.x:= 0; small.y:= 0; small.w:= 0; small.h:= 0;
screen.x:= DeskX; screen.y:= DeskY;
screen.w:= MaxWidth; screen.h:= MaxHeight;
bound.x:= DeskX; bound.y:= DeskY;
bound.w:= MaxWidth - DeskX; bound.h:= MaxHeight - DeskY;
(* Testen, ob 3D-Mode an ist *)
i := MagicAES.ApplGetinfo (MagicAES.AEOBJECTS, f, j, j, j);
mode3D := (i = 1) & (f = 1) & (Bitplanes >= 4);
IF (i # 1)
THEN
(* ApplGetinfo ist fehlgeschlagen *)
IF (MagicAES.AESGlobal.apVersion >= 0340H)
& ~FindCookie (MagiXCookie, a.lc)
THEN
(* Falcon-TOS und kein MagiC *)
mode3D := Bitplanes >= 4;
END;
END;
(* Testen, ob Systemfont proportional ist *)
i := MagicAES.ApplGetinfo (MagicAES.AEFONT, j, j, f, j);
(* Test auf MagiC *)
IF FindCookie (MagiXCookie, mgxPtr)
& (mgxPtr # NIL)
& (mgxPtr^.aesvars # NIL)
THEN
(* Scrollende Editfelder? *)
(* Format von mgxPtr^.aesvars^.date: ttmmjjjj
* Wir brauchen: jjjjmmtt
*)
crdate := ( (mgxPtr^.aesvars^.date MOD 65536L) * 65536L) +
(((mgxPtr^.aesvars^.date DIV 65536L) MOD 256L) * 256L) +
(mgxPtr^.aesvars^.date DIV (65536L*256L)) ;
IsMagiCScroll := (crdate >= $19950829L);
CALLSYS (1, 4201, CADR ("crdate: %lx, mgxDate: %lx"), crdate, mgxPtr^.aesvars^.date);
ELSE
IsMagiCScroll := FALSE;
END;
b:= NewAREA (area);
Dials:= NIL; (* InstallTermproc (DisposeDials); Die Dials werden am Programmende sowieso alle freigegeben *)
Config:= {UseSolid, UseEdit, UseALT, UseGrowbox, UseConfig, UseCenter};
ShortKey:= {KALT};
(* ScanCode-Tabelle fr die zulssigen Shortcuts ermitteln *)
Tastatur:= GetKeytable ();
FOR i:= 1 TO 99 DO (* Nur bis 99, da hier der Ziffernblock beginnt.
* Diese Zeichen werden innerhalb von DialDo umgeleitet.
*)
f:= ORD(Tastatur^.capslock^[i]);
CASE f OF
48..57, 65..90: scancodes[f]:= i;|
58..64: scancodes[f]:= -1;|
ELSE
END;
END;
(* Modulinterne Resource laden *)
(* Erstmal Speicher fr Ressource dafr allozieren *)
ALLOCATE (rscData, TSIZE (tRscData));
IF rscData = NIL THEN HALT END; (* Kein Speicher fr interne Ressource *)
(* Jetzt Resourcedaten kopieren *)
rscData^ := RscData;
(* Und jetzt relozieren *)
IF RelocRsc (rscData, rsc) THEN
asciitab:= GaddrRsc (rsc, MagicAES.RTREE, 0);
b:= NewDial (asciitab); oldPos:= -1; insMode:= TRUE;
confdial:= GaddrRsc (rsc, MagicAES.RTREE, 1);
adr:= GaddrRsc (rsc, MagicAES.RTREE, 2);
mSelect[FALSE]:= adr^[ 1].obSpec.ImagePtr^.biData;
mSelect[TRUE]:= adr^[ 2].obSpec.ImagePtr^.biData;
mKnopf[FALSE]:= adr^[ 3].obSpec.ImagePtr^.biData;
mKnopf[TRUE]:= adr^[ 4].obSpec.ImagePtr^.biData;
mCircle[FALSE]:= adr^[ 5].obSpec.ImagePtr^.biData;
mCircle[TRUE]:= adr^[ 6].obSpec.ImagePtr^.biData;
mPunktEin:= adr^[ 7].obSpec.ImagePtr^.biData;
fSelect[FALSE]:= adr^[ 8].obSpec.ImagePtr^.biData;
fSelect[TRUE]:= adr^[ 9].obSpec.ImagePtr^.biData;
fKnopf[FALSE]:= adr^[10].obSpec.ImagePtr^.biData;
fKnopf[TRUE]:= adr^[11].obSpec.ImagePtr^.biData;
fCircle[FALSE]:= adr^[12].obSpec.ImagePtr^.biData;
fCircle[TRUE]:= adr^[13].obSpec.ImagePtr^.biData;
fPunktEin:= adr^[14].obSpec.ImagePtr^.biData;
ELSE
HALT; (* Resource laden fehlgeschlagen! Bser Fehler!!! *)
END;
(* Jetzt nach Cookie suchen und ggf. Einstellungen daraus bernehmen *)
IF FindCookie (Magic, a.lc) THEN
(* Cookie gefunden *)
WITH a.x DO
IF v = 00H (* Versionsnummer im ersten Wort *)
THEN
Config := s - {7..15} + {UseConfig};
(* Nun auf Gltigkeit prfen *)
IF {UseCenter, UseMouse, UsePos} * Config = {}
THEN
INCL (Config, UseCenter);
END;
IF UseALT IN Config
THEN
ShortKey:= {KALT};
ELSE
ShortKey:= {KCTRL};
END;
END;
END (* WITH *)
END;
INCL (Config, UseEdit);
init:= 30961;
END;
END InitDials;
BEGIN
init:= 0;
InitDials;
dialDo := InternalDialDo;
END mtDials.